Java 模式匹配有什么问题?
这个程序应该是匹配的 (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} 这是我的代码: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
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,可以用simplereplaceAll
替换。我意识到这可能是优化,因为OP代码中只有一个StringBuffer,但代码可读性也很差ers@Pshemo,谢谢你花时间回答。我知道为什么它现在转换得很奇怪。但是,我使用的原因。也是为了匹配嵌套括号。现在我意识到这不起作用。你知道如何匹配嵌套括号吗?因为[^]不会匹配嵌套括号。谢谢。