Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA字符串替换(使用正则表达式)?_Java_Regex - Fatal编程技术网

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

JAVA字符串替换(使用正则表达式)?,java,regex,Java,Regex,作为学校项目的一部分,我需要替换表单中的字符串: 5 * x^3 - 6 * x^1 + 1 例如: 5x<sup>3</sup> - 6x<sup>1</sup> + 1 5x3-6x1+1 我相信正则表达式可以做到这一点,但我还不知道如何做到这一点 你能帮我一把吗 另外,实际的任务是实现一个多项式处理Java应用程序,我用它将polynomic.toString()从模型传递到视图,我想用html标记以一种漂亮的方式显示它。str.rep

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

5 * x^3 - 6 * x^1 + 1
例如:

5x<sup>3</sup> - 6x<sup>1</sup> + 1
5x3-6x1+1
我相信正则表达式可以做到这一点,但我还不知道如何做到这一点

你能帮我一把吗

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

str.replaceAll(“\\^([0-9]+)”,“$1”);
str.replaceAll("\\^([0-9]+)", "<sup>$1</sup>");

您需要研究在regex中捕获以处理^3中的3的包装。

导入java.util.regex.PatternSyntaxException;
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
}
//(:?\d+)\*x\^(:?\d+) // //选项:^和$在换行符处匹配 // //匹配下面的正则表达式,并将其匹配捕获到反向引用编号1«(:?\d+)» //匹配字符“:”字面上的«:?» //在0到1次之间,尽可能多次,根据需要回馈(贪婪)«» //匹配单个数字0..9«\d+» //在一次和无限次之间,尽可能多次,根据需要回馈(贪婪)«+» //按字面上的«匹配字符“” //按字面上的«\*»匹配字符“*” //按«x»的字面意思匹配字符“x” //按字面上的«\^»匹配字符“^” //匹配下面的正则表达式,并将其匹配捕获到反向引用编号2«(:?\d+)» //匹配字符“:”字面上的«:?» //在0到1次之间,尽可能多次,根据需要回馈(贪婪)«» //匹配单个数字0..9«\d+» //在一次和无限次之间,尽可能多次,根据需要回馈(贪婪)«+» 试一试{ String resultString=subjectString.replaceAll((?m)(:?\\d+\\\\*x\\\^(:?\\d+),“$1x$2”); }捕获(模式语法异常){ //正则表达式中的语法错误 }捕获(IllegalArgumentException ex){ //替换文本中的语法错误(未替换的$signs?) }捕获(IndexOutOfBoundsException ex){ //不存在的反向引用使用了替换文本 }
如果这适用于任何通用数学表达式,并且允许使用括号表达式,那么使用正则表达式将非常困难(可能不可能)

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

尝试以下方法:

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

确保导入java.util.regex。

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

只是用一种不同的思维方式。我不确定你的应用程序中还发生了什么。

String input=“你好,我是java开发人员”+
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>");
“不需要工作经验”+ “高级软件工程师”+ “高级软件工程师的java工作”; 字符串fixedInput=input.replaceAll(“(java | job | senior)”,“$1”);
类替换
{
公共静态void main(字符串参数[])
{
字符串Main=“5*x^3-6*x^1+1”;
替换字符串=Main.replaceAll((?m)(:?\\d+\\\\*x\\^(:?\\d+),“$1x$2”);
系统输出打印项次(替换);
}
}
私有字符串移除脚本(字符串内容){
Pattern p=Pattern.compile(“]*>(.*)”,
Pattern.DOTALL | Pattern.Pattern不区分大小写);
返回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);
String str=“5*x^3-6*x^1+1”;
str=str.replaceAll(“(?x)(\\d+)(\\s+?\\*?\\s+)(\\w+)(\\^+?)(\\d+)”,“$1$3$5”);
系统输出打印项次(str);

看看antlr4。它将使您在创建树结构方面走得更远,而不仅仅是正则表达式

(calculator.g4包含您需要的语法)

简而言之,您可以定义语法来解析表达式,使用antlr生成java代码,并在构建树时添加回调来处理计算。

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

请注意,在一个regex/replacement中加入两个替换将是一个错误的选择,因为像
x^3-6*x
这样更通用的表达式将失败。

对不起,您能更具体一点吗?我不明白你的意思,老笑话。有一个解释。哦:)我想我刚才真的读过那篇文章。。。你是说在我的例子中正则表达式不是最好的方法?所以你只允许多项式的展开形式?啊。。。但是,您没有将“5*x”折叠为“5x”这两个问题:“^需要是”\^,$需要是“$”。仍然出现错误“无效转义序列”。。。我遗漏了什么吗?这给了我第二个参数的错误:str.replaceAll(“\\^([0-9]+)”,“\$1”);我不明白…:(是否可以使用预编译模式?如果您多次使用相同的正则表达式替换all,这可能会很有用。是的,我后来在一篇P.S.注释中解释说,我正在使用它将多项式的基本字符串表示形式解析为更具可读性的形式。谢谢!多项式都可以扩展为不包含括号表达式的形式。)不过,sessions.Paren匹配非常有趣,所以您不应该只局限于扩展形式。感谢“导入”技巧。不幸的是,Eclipse在第二个参数中给了我一个错误:“无效的转义序列”Hmmm…我在GroovyConsole中测试它,但不是Java。您还必须确保这都在Java样板中(也就是说,创建一个类,并将其扔到一个主方法中)。替换字符串应该是“$1”-没有反斜杠。Groovy h
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);
"5 * x^3 - 6 * x^1 + 1".replaceAll("\\W*\\*\\W*","").replaceAll("\\^(\\d+)","<sup>$1</sup>");