Java—如何获取字符串中某个特定字符的所有匹配项并将其移动到非预定义位置?
我想将字符串中的“立方根”和“平方根”分别替换为“^(1/3)”和“^(1/2)”,但在操作数之后 进行简单替换会将“^(1/3)”和“^(1/2)”放在数字之前,但我需要它们放在数字之后(我正在使用exp4j中的ExpressionBuilder API,这需要这样做) 例如,给定以下字符串:Java—如何获取字符串中某个特定字符的所有匹配项并将其移动到非预定义位置?,java,string,replaceall,charat,mathematical-expressions,Java,String,Replaceall,Charat,Mathematical Expressions,我想将字符串中的“立方根”和“平方根”分别替换为“^(1/3)”和“^(1/2)”,但在操作数之后 进行简单替换会将“^(1/3)”和“^(1/2)”放在数字之前,但我需要它们放在数字之后(我正在使用exp4j中的ExpressionBuilder API,这需要这样做) 例如,给定以下字符串: "cube root of 27 times cube root of 64 plus square root of 9 minus square root of 4" 我希望将其转换为: "27^(
"cube root of 27 times cube root of 64 plus square root of 9 minus square root of 4"
我希望将其转换为:
"27^(1/3)*64^(1/3)+9^(1/2)-4^(1/2)"
以下是我的尝试:
String equation = "cube root of 27 times square root of 45";
String r1 = equation.replaceAll("cube root of", "◊").replaceAll("square root of", "√")
.replaceAll("times", "*").replaceAll("plus", "+").replaceAll("minus", "-")
.replaceAll("divided by", "/").replaceAll(" ", "");
System.out.println(r1);
String r2 = null;
if (r1.contains("◊"))
{
for (int i = r1.indexOf("◊")+1; i < r1.length(); i++)
{
if(Character.isDigit(r1.charAt(i)))
{
}
else
{
System.out.println("i: " + i);
r2 = r1.substring(r1.indexOf("◊")+1, i) + "^(1/3)" + r1.substring(i);
break;
}
}
}
System.out.println(r2);
因此,它只适用于一个“立方根”短语,而不是两个,并且无法适用于“平方根”短语(它不在代码中,但我尝试在第一个if()块的代码中包含它,在该块中,我查看字符串是否包含◊" 象征
我尝试使用OR r1.contains(“√)运算符,但它把我现有的代码搞砸了。我在网上到处寻找解决方案。我在程序中尝试了替换字符(字符串s,int position,char c)等方法来替换指定位置的字符,但我无法让它处理所有出现的指定短语
我花了几个星期的时间来寻找一个解决方案,但我找不到一个可以用这两个短语来代替数学运算的解决方案
我非常感谢您在这里发布的任何帮助。您好,这里有一个简单的实现。首先,您可以累积与正则表达式字符串匹配的所有值。您有以下正则表达式 “cube”或“square”类型的正则表达式,后跟数字的“root of”。现在您已经构建了您所使用的正则表达式
String mydata = "some string with 'the data i want' inside";
Pattern pattern = Pattern.compile("'(.*?)'");
Matcher matcher = pattern.matcher(mydata);
if (matcher.find())
{
System.out.println(matcher.group(0));
}
这将提取数字的值。一旦这样做,您需要用所需的替换正则表达式的完整匹配项
可能有更好的实现。这是我想到的第一个。基本上,在尝试替换任何东西之前,您需要更多地使用正则表达式。并且将其视为一个整体—一个完整的正则表达式,而不是尝试将其拆分为更小的元素。假设您想要转换”123“到123^(1/3)”等的立方根(您的问题不清楚),捕获操作数并使用反向引用:
equation = equation.replaceAll("cube root of (\\S+)", "$1^(1/3)")
.replaceAll("square root of (\\S+)", "$1^(1/2)")
.replace("times", "*").replace("plus", "+").replace("minus", "-")
.replace("divided by", "/").replace(" ", "");
请注意,对于非正则表达式替换,纯文本replace()
就足够了(并且是首选)-它仍然替换所有出现的表达式,但不使用正则表达式
一些测试代码:
String equation = "cube root of 8 times square root of 4 plus cube root of 27 minus 3";
equation = equation.replaceAll("cube root of (\\S+)", "$1^(1/3)")
.replaceAll("square root of (\\S+)", "$1^(1/2)")
.replace("times", "*").replace("plus", "+").replace("minus", "-")
.replace("divided by", "/").replace(" ", "");
System.out.println(equation);
输出:
8^(1/3)*4^(1/2)+27^(1/3)-3
对于初学者,不要使用
replaceAll()
,只使用replace()
,它仍然会替换所有出现的内容,但是纯文本替换(不是正则表达式替换)是否会使“27的立方根”变为“27^(1/3)”等?是的,这是我的意图。如果短语是“27倍的立方根64倍的平方根9倍的平方根4“,我想把它翻译成:“27^(1/3)*64^(1/3)*9^(1/2)*4^(1/2)。*运算符可以是任何东西,比如+,-,甚至是/这样一个简单而优雅的答案!非常感谢你的波希米亚风格!我的意图是使用一个字符串,比如:例如,“27的立方根减去4的平方根加上9乘以64的立方根的平方根”,并将其转换为:“27^(1/3)-4^(1/2)+9^(1/2)*64^(1/3),这在@cid np中非常有效。这对学习regex非常有用。fyi\S
表示“非空白字符”,使用括号“捕获”输入,$1
表示“组1”(捕获组从1开始编号)。
8^(1/3)*4^(1/2)+27^(1/3)-3