【问题标题】:Regex, are "[ ]" and "( )" mean the same (space)?正则表达式,“[]”和“()”是否表示相同(空格)?
【发布时间】:2015-07-06 23:54:08
【问题描述】:

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

这是我的字符串...

cook, eat, write, play

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

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

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

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

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

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

【问题讨论】:

  • 在其中一个正则表达式站点上尝试表达式。他们对表达式中的所有内容进行了解释。 regex101.com [] 是一个字符类。 () 是一个捕获组。字符类允许字符在里面;捕获组捕获内部的值。
  • 为什么你认为第二个正则表达式不起作用?他们都工作herehere
  • 如果您开启了 ignore whitespace 标志,( ) 之间的空格将被忽略,而在任何模式下,[ ] 中的空格永远不会被忽略。
  • 谢谢大家,@sln 你是如何激活ignore whitspace flag 的?我已经查看了这个链接msdn.microsoft.com/en-us/library/yd1hzczs(v=vs.110).aspx,我通过执行(?m) 来启用多行,并通过执行(?s) 来启用单行,但是如何启用ignorewhitspace?输入这个(?x)???谢谢高级。
  • 它只是 IgnorePatternWhitespace。然后你可以在代码中使用格式化的多行表达式(就像我的帖子一样)。便于阅读/维护。我很确定您可以使用内联 (?x) 修饰符,但它应该是 " 代码字符串分隔符之后的第一个构造。如果您使用忽略空格,请记住任何自然空格必须被转义或在一个类中(即[ ]\ )。我建议使用regexformat 来格式化和压缩正则表达式,因为它会自动处理这个问题。

标签: regex string


【解决方案1】:

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

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

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

FWIW,您的正则表达式仍然有效,但我怀疑您依赖于其他地方的捕获组索引,这就是它崩溃的原因;您添加了更多捕获组!您还可以通过使用命名捕获组来避免这种对特定组放置的依赖:

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

在这种情况下,我将初始捕获组命名为&lt;start&gt;,然后,我们可以测试&lt;start&gt; 是否按名称而不是按索引匹配,这样即使您添加或删除捕获组,您的测试始终引用相同的捕获。

您还可以通过仅使用匹配的两个变体来简化这一点,以避免测试捕获:

/^write, |, write/

也就是说,要么字符串必须匹配行首和字符串“write,”,要么必须匹配“,write”。无需担心反向引用测试即可表达相同的情绪。

【讨论】:

  • 感谢@Chris heald,真的很感谢大家,这个问题之前所有的cmet都回答了,这个,不知道谁来答题。
猜你喜欢
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
  • 2013-11-01
  • 2021-04-10
  • 1970-01-01
相关资源
最近更新 更多