字符串替换(使用正则表达式) ?

作为学校项目的一部分,我需要替换表单中的一个字符串:

5 * x^3 - 6 * x^1 + 1

比如:

5x<sup>3</sup> - 6x<sup>1</sup> + 1

我相信正则表达式可以做到这一点,但我不知道如何做到这一点。

你能帮我一把吗?

附言。实际的任务是实现一个多项式处理 Java 应用程序,我使用它来将 Polynomial.toString ()从模型传递到视图,我希望以一种漂亮的方式使用 html 标记来显示它。

597656 次浏览
str.replaceAll("\\^([0-9]+)", "<sup>$1</sup>");

您需要研究如何在正则表达式中捕获,以处理包装3 in ^ 3的问题。

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
}

如果这是对于任何一般的数学表达式和括号表达式是允许的,将是非常困难的(也许不可能)做到这一点与正则表达式。

如果唯一的替代品是你展示的那些,这并不难做到。首先去掉 *的,然后使用捕捉像 Can Berk Güder 显示处理的 ^的。

试试这个:

String str = "5 * x^3 - 6 * x^1 + 1";
String replacedStr = str.replaceAll("\\^(\\d+)", "<sup>\$1</sup>");

一定要导入 java.util.regex。

你的多项式是什么?如果你正在“处理”它,我设想在某个时刻生成某种子表达式树,并认为用它来生成字符串比用正则表达式重新解析原始表达式要简单得多。

我只是换了一种思考方式,我不知道你的应用程序里还有什么。

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>");
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);
}
}
private String removeScript(String content) {
Pattern p = Pattern.compile("<script[^>]*>(.*?)</script>",
Pattern.DOTALL | Pattern.CASE_INSENSITIVE);
return p.matcher(content).replaceAll("");
}

试试这个,可能不是最好的方法,但它的工作

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);

看看 Antlr4。与仅使用正则表达式相比,它将使您在创建树结构方面取得更大的进展。

https://github.com/antlr/grammars-v4/tree/master/calculator(Calculator.g4包含您需要的语法)

简而言之,定义语法来解析表达式,使用 antlr 生成 Java 代码,并在构建树时添加回调来处理求值。

"5 * x^3 - 6 * x^1 + 1".replaceAll("\\W*\\*\\W*","").replaceAll("\\^(\\d+)","<sup>$1</sup>");

请注意,将两个替换放在同一个正则表达式/替换中将是一个糟糕的选择,因为更多的一般表达式(如 x^3 - 6 * x)将会失败。