Java;文字列置換(正規表現を使用)?
学校向けプロジェクトの一環として、フォームの文字列を置き換える必要があります。
5 * x^3 - 6 * x^1 + 1
次のようなものに:
5x<sup>3</sup> - 6x<sup>1</sup> + 1
これは正規表現を使用して実行できると考えていますが、その方法はまだわかりません。
手を貸してもらえますか?
追伸実際の割り当ては、多項式処理Javaアプリケーションを実装することです。これを使用して、モデルからビューにPolynomial.toString()を渡します。HTMLタグを使用して、方法。
str.replaceAll("\\^([0-9]+)", "<sup>$1</sup>");
private String removeScript(String content) {
Pattern p = Pattern.compile("<script[^>]*>(.*?)</script>",
Pattern.DOTALL | Pattern.CASE_INSENSITIVE);
return p.matcher(content).replaceAll("");
}
String input = "hello I'm a Java dev" +
"no job experience needed" +
"senior software engineer" +
"Java job available for senior software engineer";
String fixedInput = input.replaceAll("(Java|job|senior)", "<b>$1</b>");
import Java.util.regex.PatternSyntaxException;
// (:?\d+) \* x\^(:?\d+)
//
// Options: ^ and $ match at line breaks
//
// Match the regular expression below and capture its match into backreference number 1 «(:?\d+)»
// Match the character “:” literally «:?»
// Between zero and one times, as many times as possible, giving back as needed (greedy) «?»
// Match a single digit 0..9 «\d+»
// Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
// Match the character “ ” literally « »
// Match the character “*” literally «\*»
// Match the characters “ x” literally « x»
// Match the character “^” literally «\^»
// Match the regular expression below and capture its match into backreference number 2 «(:?\d+)»
// Match the character “:” literally «:?»
// Between zero and one times, as many times as possible, giving back as needed (greedy) «?»
// Match a single digit 0..9 «\d+»
// Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
try {
String resultString = subjectString.replaceAll("(?m)(:?\\d+) \\* x\\^(:?\\d+)", "$1x<sup>$2</sup>");
} catch (PatternSyntaxException ex) {
// Syntax error in the regular expression
} catch (IllegalArgumentException ex) {
// Syntax error in the replacement text (unescaped $ signs?)
} catch (IndexOutOfBoundsException ex) {
// Non-existent backreference used the replacement text
}
"5 * x^3 - 6 * x^1 + 1".replaceAll("\\W*\\*\\W*","").replaceAll("\\^(\\d+)","<sup>$1</sup>");
x^3 - 6 * x
などのより一般的な式が失敗するため、単一の正規表現/置換で両方の置換を結合することは悪い選択になることに注意してください。
これが一般的な数式であり、括弧で囲まれた式が許可されている場合、正規表現でこれを行うことは非常に困難です(おそらく不可能です)。
あなたが示したものだけが交換品であるなら、それは難しくありません。最初に*
を削除してから、Can BerkGüderが示したようなキャプチャを使用して^
を処理します。
あなたの多項式は何ですか?あなたがそれを「処理」している場合、私はある時点で生成される部分式のツリーを想定しています。正規表現を使用した式。
そこに別の考え方を投げるだけです。アプリで他に何が起こっているのか分かりません。
class Replacement
{
public static void main(String args[])
{
String Main = "5 * x^3 - 6 * x^1 + 1";
String replaced = Main.replaceAll("(?m)(:?\\d+) \\* x\\^(:?\\d+)", "$1x<sup>$2</sup>");
System.out.println(replaced);
}
}
これを試してください、最善の方法ではないかもしれません。しかし、それは動作します
String str = "5 * x^3 - 6 * x^1 + 1";
str = str.replaceAll("(?x)(\\d+)(\\s+?\\*?\\s+?)(\\w+?)(\\^+?)(\\d+?)", "$1$3<sup>$5</sup>");
System.out.println(str);
^ 3での3のラップを処理するために、正規表現でのキャプチャを検討する必要があります。
これを試して:
String str = "5 * x^3 - 6 * x^1 + 1";
String replacedStr = str.replaceAll("\\^(\\d+)", "<sup>\$1</sup>");
必ずJava.util.regexをインポートしてください。
Antlr4を見てください。ツリー構造を作成する際に、正規表現のみよりもはるかに先に進みます。
https://github.com/antlr/grammars-v4/tree/master/calculator (calculator.g4には必要な文法が含まれています)
簡単に言えば、文法を定義して式を解析し、antlrを使用してJavaコードを生成し、ツリーの構築時に評価を処理するコールバックを追加します。