这是我的第一个问题。很高兴与大家见面。
我在Java 8中创建了以下正则表达式模式(这只是我实际代码的简化示例,为了清晰起见):
(?<!a)([0-9])\,([0-9])(?!a)|(?<!b)([0-9]) ([0-9])(?!b)|(?<!c)([0-9])([0-9])(?!c)
一般来说,这包括三种选择: 第一种匹配由逗号分隔的两个单个数字,例如:
1,1
2,0
4,5
第二个正则表达式匹配以空格分隔的两个单个数字,例如:
1 1
2 0
4 5
第三个模式匹配了两个连续的单个数字,例如:
11
20
45
每个替代方案都使用了“lookaround”,它们的内容必须略有不同 - 这就是为什么我不能把所有东西都放在一起的原因:
([0-9])[, ]?([0-9])
每个匹配的数字都被包含在一个捕获组中,现在我有了第二行来“呼叫”这些捕获的数字,如下所示:
(?<!n)($1 $2|$3 $4|$5 $6)(?!n)
所以,最终我需要匹配一个文本,其中的数字用单个空格分隔,且不被'n'包围。因此,如果上面任何一个示例都符合第1行的模式,则第2行的模式应该匹配这些内容:
1 1
2 0
4 5
11 11
22 00
44 55
而不是这些:
n1 1
2,0
45
asd asd asd
问题如下:即使在被测试的文本中没有这些捕获的数字,它也会返回匹配项,但我确实有空格... 所以在这里我没有得到匹配,这是正确的:
aaaaaaaaa
bbbbbbbbb
aasdfasdf
但是这里我得到以下匹配项(最明显的原因是有一个或多个空格):
abc abc
q w r t y
as df
请问有人知道这种情况是否正常,即使捕获组中的字符没有被第一行捕获,'非捕获组'部分(一个空格)仍会匹配,因此整个模式返回匹配,就好像如果第一行未捕获任何内容,则捕获组可以是零长度匹配的第二行?感谢您对此的任何评论。
(?<!a)
,(?<!b)
,(?<!c)
应该做什么/匹配什么? - xerx593