Java的; stringreplace(使用正则expression式)?

作为学校项目的一部分,我需要从表单中replace一个string:

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

像这样的东西:

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

我相信这可以用正则expression式来完成,但我不知道如何去做。

你能帮我一把吗?

PS实际的任务是实现一个多项式处理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 } 

如果这是用于任何一般的mathexpression式,并且允许使用括号expression式,那么用正则expression式来做这件事将是非常困难的(也许是不可能的)。

如果唯一的替代品是你所展示的,那就不难做了。 首先去掉* ,然后使用Can BerkGüder显示的处理方式捕获^

你的多项式是什么? 如果你正在“处理”它,我想到了某种forms的子expression式在某种程度上被生成,并且会认为使用它来生成你的string要比重新parsing生成要简单得多expression式与正则expression式。

只是抛出不同的思维方式。 我不确定你的应用还有什么进展。

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

请注意,在一个正则expression式/replace中join两个replace将是一个不好的select,因为更通用的expression式如x^3 - 6 * x将会失败。

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

你会想看看在正则expression式捕获包装3 ^ 3。

尝试这个:

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

一定要导入java.util.regex。

看看antlr4。 它会让你在创build一个比正则expression式更多的树结构。

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

简而言之,您可以定义语法来parsingexpression式,使用antlr生成Java代码,并在构build树时添加callback来处理评估。

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

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