我有一个关于正则表达式的问题
这是我的字符串...
cook, eat, write, play
在我之前制作的很多正则表达式中,我总是使用( )
来引用空格我知道我应该避免使用\s
来引用空格,因为它包括回车,换行等,但是为什么在下面这个正则表达式中使用[ ]
来引用空格?
(^)?(?:,[ ])?write(?(1),[ ])
我已尝试将[ ]
替换为( )
,就像这样......
(^)?(?:,( ))?write(?(1),( ))
但是,如果我这样做,正则表达式不再起作用,为什么会这样?
为什么你可以在某些正则表达式中使用( )
来引用空格,以及为什么在上面的正则表达式示例中你不能这样做呢?
答案 0 :(得分:2)
()
描述捕获组。 (?: ...)
是一个非捕获组。通过将空格描绘为( )
,您在空间上匹配并捕获捕获组中的该空间。
(?(1), [ ])
是对第一个捕获组(^)
是否匹配的测试,如果匹配,则对该组中的位执行额外匹配。
您不需要在空格周围添加()或[]以匹配它;文字字符也可以正常工作!
你的正则表达式仍然有效,FWIW,但我怀疑你依赖其他地方的捕获组索引,这就是为什么它会破坏;您已添加更多捕获组!您还可以使用命名捕获组来避免对特定组放置的这种依赖:
(?<start>^)?(, )?write(?(<start>), )
在这种情况下,我命名了初始捕获组<start>
,然后我们可以测试<start>
是否与名称匹配,而不是通过索引匹配,这样即使如果添加或删除捕获组,则测试始终引用相同的捕获。
你也可以通过两个匹配的变体来简化这一点,以避免测试捕获:
/^write, |, write/
也就是说,字符串必须匹配行的开头和字符串&#34; write,&#34;,或者它必须匹配&#34;,写&#34;。表达同样的情绪,而不必担心反向引用测试。