-2

下面提到的 Ruby 正则表达式 (Regex) 有何不同?

  • (?imx)(?-imx)
  • (?imx:..)(?-imx:..)

怎么(?ix-ix: )工作Regex?我找到了这个文档:

  • (?imx)打开 i、m 或 x 选项。
  • (?-imx)关闭 i、m 或 x 选项。
  • (?imx:..)在括号内切换 i、m 或 x 选项。
  • (?-imx:..)关闭括号内的 i、m 或 x 选项。
  • (?ix-ix: )打开(或关闭)此非捕获组中的 i 和 x 选项。

但是在代码中它们将如何被使用,无法理解。那么,对于小代码有什么帮助来证明上面提到的差异吗?

4

1 回答 1

3

(?x)适用于当前括号集的末尾,或者整个正则表达式(如果它不在括号内)。 (?x:...)适用于括号内的任何内容。

所以,真的,这个:

(?x: ... )

只是写这个的更简单的方法:

(?:(?x) ... )

它的工作原理是这样的:

/red (?i) blue ( ( (?x) ( (?-i) green ) yellow ) purple )/
     ^^^^^^^^^^^^^^^^^^^^^             ^^^^^^^^^^^^^^^^^^^
     'i' is turned on here...          and here
                          ^^^^^^^^^^^^^
                          but 'i' is turned off here
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                    'x' is turned on here

(?s-m:...)是另一个快捷方式:它s 打开m 关闭。您也可以将其写为(?:(?s)(?-m)...),但这很难阅读。

(?ix-ix:...)i是一个非常糟糕的例子,因为打开和关闭x 没有任何意义。


例子:

这将匹配:

/one (?i)TWO THREE/.match 'one two three'

这不会,因为该i标志仅适用于()

/one ((?i)TWO) THREE/.match 'one two three'

这也不会,并且与上面的相同,除了括号不会捕获:

/one (?i:TWO) THREE/.match 'one two three'

但这些将匹配:

/one (?i:TWO THREE)/.match 'one two three'
/one (?i:TWO) three/.match 'one two three'
于 2013-01-18T20:47:37.863 回答