Java 正则表达式捕获组不';t识别组(1),尽管匹配()正确
我正在用Java编写一些简单(我认为)的正则表达式,以删除直接出现在某个指定标点旁边的星号或符号。Java 正则表达式捕获组不';t识别组(1),尽管匹配()正确,java,regex,capturing-group,Java,Regex,Capturing Group,我正在用Java编写一些简单(我认为)的正则表达式,以删除直接出现在某个指定标点旁边的星号或符号。 这是我的原始代码: String ptr = "\\s*[\\*&]+\\s*"; String punct1 = "[,;=\\{}\\[\\]\\)]"; //need two because bracket rules different for ptr to left or right String punct2 = "[,;=\\{}\\[\\]\\(]"; out = out
这是我的原始代码:
String ptr = "\\s*[\\*&]+\\s*";
String punct1 = "[,;=\\{}\\[\\]\\)]"; //need two because bracket rules different for ptr to left or right
String punct2 = "[,;=\\{}\\[\\]\\(]";
out = out.replaceAll(ptr+"("+punct1+")|("+punct2+")"+ptr,"$1");
它不仅删除了字符串的“ptr”部分,还删除了点刺!(即用空字符串替换匹配字符串)我做了进一步的研究:
String ptrStr = ".*"+ptr+"("+punct1+")"+".*|.*("+punct2+")"+ptr+".*";
Matcher m_ptrStr = Pattern.compile(ptrStr).matcher(out);
并发现:
m_ptrStr.matches() //returns true, but...
m_ptrStr.group(1) //returns null??
我不知道我做错了什么,因为我以前在更复杂的正则表达式中使用过这个精确的方法,组(1)总是返回捕获的组。一定有什么东西我没发现,所以。。有什么想法吗?当您的模式中有
|
时,这意味着允许匹配者匹配两个模式中的一个。无论它匹配哪一个,它匹配的模式的任何捕获组都将返回子字符串——但是其他模式的任何捕获组都将返回null
,因为其他模式没有真正匹配
看起来你的模式是
.*\s*[\*&]+\s*([,;=\{}\[\]\)]).*|.*([,;=\{}\[\]\(])+\s*[\*&]+\s*.*
------------- left ------------- -------------- right ------------
如果
matches()
返回true,则您的字符串与“left”模式匹配,在这种情况下group(1)
将为非null,而group(2)
将为null;或者它匹配“右”模式,在这种情况下,组(1)
将为空,组(2)
非空。[注意:匹配器不会尝试确定双方是否成功匹配。也就是说,如果左侧匹配,它不会检查右侧。]问题是,您在每一侧都有一个捕获组:
(regex1)|(regex2)
匹配器将启动并使用第一次交替搜索匹配;如果找不到,它将尝试第二次替换
然而,这仍然是两组,只有一组会匹配。不匹配的将返回null,这就是这里发生在您身上的情况
因此,您需要测试这两个组;因为您有一个匹配项,所以至少有一个不会为空。无需引用
{
,*
或字符类中的参数。我怀疑。组(1)在这里为空,因为它是您的第二个组,具有匹配项哦!我认为组(1)是第一个匹配的组,无论它在正则表达式字符串中的哪个位置。这解释了很多,谢谢!”匹配者不会检查它是否匹配双方“@fge我不是指第一个备选方案失败的情况,但我已尝试澄清措辞。有趣(令人惊讶)关于其他regex引擎的花絮——谢谢。是的,对不起……我已经习惯了regex语言,在这些语言中,这不是一个值得关注的问题:/