Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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_Pattern Matching - Fatal编程技术网

Java 模式匹配有什么问题?

Java 模式匹配有什么问题?,java,regex,pattern-matching,Java,Regex,Pattern Matching,这个程序应该是匹配的 (as(fd)) 并将其转换为 \pochhammer{as(fd)}{n} 但是,它没有正确转换字符串。它正在转变 W_n(-a^2;a,b,c,d)=(a+b)\n(a+c)\n(a+d)\n\ 到 W_n\pochhammer{-a^2;a,b,c,d)=(a+b}{n}\pochhammer{a+c}{n}\pochhammer{a+d}{n} 何时应将其转换为 W_n(-a^2;a,b,c,d)=\pochhammer{a+b}{n}\pochhammer{a+c

这个程序应该是匹配的

(as(fd))

并将其转换为

\pochhammer{as(fd)}{n}

但是,它没有正确转换字符串。它正在转变

W_n(-a^2;a,b,c,d)=(a+b)\n(a+c)\n(a+d)\n\

W_n\pochhammer{-a^2;a,b,c,d)=(a+b}{n}\pochhammer{a+c}{n}\pochhammer{a+d}{n}

何时应将其转换为

W_n(-a^2;a,b,c,d)=\pochhammer{a+b}{n}\pochhammer{a+c}{n}\pochhammer{a+d}{n}

这是我的代码:

while(scanner.hasNextLine()) {
    String line = scanner.nextLine();
    Pattern cpochhammer = Pattern.compile("(\\((.*?)\\)_\\{([^}]+)\\})");
    Matcher pochhammer = cpochhammer.matcher(line);
    StringBuffer rplcmntBfr = new StringBuffer();

    while(pochhammer.find())  {
        pochhammer.appendReplacement(rplcmntBfr, "\\\\pochhammer{$2}{$3}");
    }

    pochhammer.appendTail(rplcmntBfr);  
    Pattern npochhammer = Pattern.compile("(\\((.*?)\\)_(.))");
    Matcher ppochhammer = npochhammer.matcher(rplcmntBfr. toString() );
    rplcmntBfr.setLength(0);

    while(ppochhammer.find())  {
        ppochhammer.appendReplacement(rplcmntBfr, "\\\\pochhammer{$2}{$3}");
    }

    ppochhammer.appendTail(rplcmntBfr);
    writer.println(rplcmntBfr);
}

谢谢。

我可能弄错了,但也许你在找类似的东西

String replaced = line.replaceAll("\\(([^)]*)\\)_(\\w+)", "\\\\pochhammer{$1}{$2}");
//                                                ^^^^ 
//                                  You can use \\d or \\d+ instead
//                                  this part. I am not sure what `n` can be
当您更详细地描述您的问题时,我可以尝试更正我的答案,比如您试图通过第一个循环实现什么?用
{$2}{$3}
替换
“(\\(.*?\)\\\\\{([^}]+)\})”
\\\\pochhammer{$2}{$3}
在这里似乎毫无意义,因为您的输入中没有
(xxx){{n}

所以唯一的问题似乎是你的第二个正则表达式是
(\\(.*?\)\()
。如果你仔细看一下,你不需要你的外括号,因为它们只会构成第1组第2组,所以不是

    (\\((.*?)\\)_(.)) you can use 
     \\((.*?)\\)_(.)
接下来,您将使用
*?
,这意味着可以匹配任何字符,因此
\(.*?\)\u
将首先匹配任何字符
),最后一个
,它后面有
\
,就像您的情况一样

 W_n(-a^2;a,b,c,d)=(a+b)_n(a+c)_n(a+d)_n\,,
     ^^^^^^^^^^^^^^^^^^
     this part
结果给了你什么

 W_n\pochhammer{-a^2;a,b,c,d)=(a+b}{n}\pochhammer{a+c}{n}\pochhammer{a+d}{n}\,,
                ^^^^^^^^^^^^^^^^^^

要解决此问题,您可以使用
[^)]
而不是像我的答案顶部的解决方案中那样使用
。这样,您将只匹配单个而不是嵌套的括号集,如
(xxx)
,因为在这种情况下
x
不能是
[^)]
意味着-除了
)之外的每个字符。

匹配(as(fd))\n您能详细说明一下吗?举个例子,显然你不是指那个文本字符串;您想匹配的是什么?如果您有嵌套的paren,java的regex现在无法处理这些。Jerry是对的,找到平衡括号的唯一方法是使用支持递归的第三方regex库或编写您自己的解析器。@OP检查我的更新答案,特别是关于
*?
vs
[^]的部分*
。从源代码中,搜索表达式应为\(([^)]*)\ \。@wumpz抱歉,什么?为什么
?我不希望
\uuu
后面的部分是任何类似
的字符。
\\w
\\d
在那里似乎更合适。他在他的源代码中使用了
(\\(.*?)\)或者我在这里搞错了。但是如果你避免
在那里匹配。更安全。@wumpz是的,OP确实使用了它,但那是他/她的源代码,不是我的(这让我在你的评论中感到困惑)。在我提出更详细的建议时,OP也使用了
。另一点是OP使用
while
循环,并使用appendReplacement和appendTail,可以用simple
replaceAll
替换。我意识到这可能是优化,因为OP代码中只有一个StringBuffer,但代码可读性也很差ers@Pshemo,谢谢你花时间回答。我知道为什么它现在转换得很奇怪。但是,我使用的原因。也是为了匹配嵌套括号。现在我意识到这不起作用。你知道如何匹配嵌套括号吗?因为[^]不会匹配嵌套括号。谢谢。