-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 に答える