Java “如何转数”;Sqrt[内部的一些文本]”;我的意思是从[]到()
我得到了如下表达式,它可以是这样的(Sqrt[XXX]的数量是未知的) 我想把所有的Java “如何转数”;Sqrt[内部的一些文本]”;我的意思是从[]到(),java,regex,Java,Regex,我得到了如下表达式,它可以是这样的(Sqrt[XXX]的数量是未知的) 我想把所有的Sqrt[XXX]变成Sqrt(XXX),我想把Sqrt的[]括号换成()括号 所以上面的例子看起来像 Sqrt(A+B)+Sqrt(Min[A,B])*Min[Sqrt(C,D)] 我不想“伤害”表达式中的另一个[]括号(如Min旁边的括号) 如何使用regex执行此操作?使用给定的源字符串格式,可以使用3个正则表达式执行此操作。这里的诀窍是“重命名”属于Min函数的方括号,并在以后恢复它们。您可以执行以下操作
Sqrt[XXX]
变成Sqrt(XXX)
,我想把Sqrt
的[]
括号换成()
括号
所以上面的例子看起来像
Sqrt(A+B)+Sqrt(Min[A,B])*Min[Sqrt(C,D)]
我不想“伤害”表达式中的另一个[]
括号(如Min
旁边的括号)
如何使用regex执行此操作?使用给定的源字符串格式,可以使用3个正则表达式执行此操作。这里的诀窍是“重命名”属于
Min
函数的方括号,并在以后恢复它们。您可以执行以下操作:
s/Min\[([^[]+)\]/Min\{$1\}/g;
s/Qsrt\[([^[]+)\]/Sqrt\($1\)/g;
s/Min\{([^{]+)\}/Min\[$1\]}/g;
对于一般情况,解析器将是一种方法。对于像这样的特殊情况,使用技巧可能会起作用:-)。您可以通过对字符串中的字符进行迭代来实现这一点。首先查找
Sqrt[
的索引,然后查找匹配的结束括号
以下是一些示例代码:
final String s = "Sqrt[A+B] + Sqrt[Min[A,B]] * Min[Sqrt[C],D]";
final char[] charArray = s.toCharArray();
int index = s.indexOf("Sqrt[");
while (index != -1) {
final int open = index + 4;
charArray[open] = '(';
// look for closing bracket
int close;
int matching = 0;
for (close = open + 1; close < charArray.length; close++) {
char c = charArray[close];
if (c == ']') {
if (matching == 0) {
break;
}
matching--;
} else if (c == '[') {
matching++;
}
}
charArray[close] = ')';
index = s.indexOf("Sqrt[", index + 1);
}
System.out.println(new String(charArray));
final String s=“Sqrt[A+B]+Sqrt[Min[A,B]]*Min[Sqrt[C],D]”;
final char[]charArray=s.toCharArray();
int index=s.indexOf(“Sqrt[”);
while(索引!=-1){
最终开放整数=指数+4;
charArray[open]='(';
//寻找结束括号
int-close;
int匹配=0;
用于(关闭=打开+1;关闭
我没有正确地测试它,所以请这样做。你不能用正则表达式来做,请看这里的公认答案@MK我担心他通常可以用回溯法来做(由于perl~,合理的REs和我们现在的混乱之间的区别)。但是我同意这不是一种方法。@Voo我很确定你甚至不能用回溯法。(+1)我没有尝试过测试代码,但我认为这种方法比使用正则表达式更适合这个问题。是的,这应该是可行的,尽管人们确实应该添加一个带有
Sqrt[a+Sqrt[a]]
的测试用例。但这应该也可以毫无问题地工作。
final String s = "Sqrt[A+B] + Sqrt[Min[A,B]] * Min[Sqrt[C],D]";
final char[] charArray = s.toCharArray();
int index = s.indexOf("Sqrt[");
while (index != -1) {
final int open = index + 4;
charArray[open] = '(';
// look for closing bracket
int close;
int matching = 0;
for (close = open + 1; close < charArray.length; close++) {
char c = charArray[close];
if (c == ']') {
if (matching == 0) {
break;
}
matching--;
} else if (c == '[') {
matching++;
}
}
charArray[close] = ')';
index = s.indexOf("Sqrt[", index + 1);
}
System.out.println(new String(charArray));