Java正则表达式中positive lookbehind内capturing group的异常行为及解决方案咨询
Java正则表达式中positive lookbehind内capturing group的异常行为及解决方案咨询
我遇到了一个只在Java正则表达式里出现的问题,像PCRE这类其他正则引擎不会有这种情况。
我使用的正则表达式是:(?:(?<=([A-Za-z\d]))|\b)(MyString),其中正向后视断言(positive lookbehind)里包含了一个捕获组([A-Za-z\d])。
我尝试匹配字符串string.MyString(具体是通过Pattern.matcher(regex)调用replaceAll方法),结果发现两种引擎的表现完全不同:
- 在PCRE中,只会匹配到
MyString,它会作为匹配结果的第二组; - 但在Java中,却会把
string里的g匹配为第一组,MyString作为第二组。
我有两个疑问:
- 为什么Java会有这样的行为?在我看来,这个正则的逻辑应该是:只有当
[A-Za-z\d]匹配的字符直接出现在MyString前面时才会被捕获,但这里g后面是.,并不是MyString,这完全不符合预期啊。 - 我该怎么修改才能避免捕获这个
g?同时我还想保留这个捕获组,因为当遇到像stringMyString这样的字符串时,我确实需要把g作为第一组捕获到。
备注:内容来源于stack exchange,提问作者wouldnotliketo
相关产品推荐
相关产品推荐

