正则表达式,“[]”和“()”表示相同(空格)?

时间:2015-07-06 23:54:09

标签: regex string

我有一个关于正则表达式的问题

这是我的字符串...

cook, eat, write, play

在我之前制作的很多正则表达式中,我总是使用( )来引用空格我知道我应该避免使用\s来引用空格,因为它包括回车,换行等,但是为什么在下面这个正则表达式中使用[ ]来引用空格?

(^)?(?:,[ ])?write(?(1),[ ])

我已尝试将[ ]替换为( ),就像这样......

(^)?(?:,( ))?write(?(1),( ))

但是,如果我这样做,正则表达式不再起作用,为什么会这样?

为什么你可以在某些正则表达式中使用( )来引用空格,以及为什么在上面的正则表达式示例中你不能这样做呢?

1 个答案:

答案 0 :(得分:2)

默认情况下,

()描述捕获组。 (?: ...)是一个非捕获组。通过将空格描绘为( ),您在空间上匹配并捕获捕获组中的该空间。

(?(1), [ ])是对第一个捕获组(^)是否匹配的测试,如果匹配,则对该组中的位执行额外匹配。

您不需要在空格周围添加()或[]以匹配它;文字字符也可以正常工作!

你的正则表达式仍然有效,FWIW,但我怀疑你依赖其他地方的捕获组索引,这就是为什么它会破坏;您已添加更多捕获组!您还可以使用命名捕获组来避免对特定组放置的这种依赖:

(?<start>^)?(, )?write(?(<start>), )

在这种情况下,我命名了初始捕获组<start>,然后我们可以测试<start>是否与名称匹配,而不是通过索引匹配,这样即使如果添加或删除捕获组,则测试始终引用相同的捕获。

你也可以通过两个匹配的变体来简化这一点,以避免测试捕获:

/^write, |, write/

也就是说,字符串必须匹配行的开头和字符串&#34; write,&#34;,或者它必须匹配&#34;,写&#34;。表达同样的情绪,而不必担心反向引用测试。