Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.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

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 正则表达式捕获组不';t识别组(1),尽管匹配()正确_Java_Regex_Capturing Group - Fatal编程技术网

Java 正则表达式捕获组不';t识别组(1),尽管匹配()正确

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

我正在用Java编写一些简单(我认为)的正则表达式,以删除直接出现在某个指定标点旁边的星号或符号。
这是我的原始代码:

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语言,在这些语言中,这不是一个值得关注的问题:/