Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.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 “如何转数”;Sqrt[内部的一些文本]”;我的意思是从[]到()_Java_Regex - Fatal编程技术网

Java “如何转数”;Sqrt[内部的一些文本]”;我的意思是从[]到()

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