1. ホーム
  2. php

[解決済み] 正規表現「[^][]」とはどういう意味ですか?

2022-02-24 10:02:19

質問

以下の正規表現で見つけました。

\[(?:[^][]|(?R))*\]

角括弧(とその内容)と入れ子になった角括弧にマッチします。

解決方法は?

[^][] を除くすべての文字を意味する文字クラスです。 [] .

をエスケープしないようにすることができます。 [] で使用される正規表現エンジンである PCRE にとって曖昧でないため、特別な文字を使用することができます。 preg_ 関数を使用することができます。

以来 [^] は PCRE では正しくないので、正規表現でパースする唯一の方法は ] が文字クラスの中にある場合は、後で閉じます。同じように [ に続く。文字クラスを開き直すことはできません(POSIX文字クラスは除く [:alnum:] ) の中にある文字クラスです。そうすると、最後の ] は明確で、文字クラスの終わりです。しかし [ 文字クラスの外側は、文字クラスの始まりとしてパースされるため、エスケープする必要があります。

同じように []] または [[] または [^[] をエスケープせずに [ または ] を文字クラスで指定します。

注意: PHP 7.3 以降、文字クラスの内部でも空白文字を無視できる inline xx 修飾を使用することができます。このようにすることで、これらのクラスをよりあいまいでない方法で書くことができます。 (?xx) [^ ][ ] [ ] ] [ [ ] [^ [ ] .

この構文は、いくつかの正規表現フレーバーで使用できます。PCRE (PHP, R)、Perl、Python、Java、.NET、GO、awk、Tcl ( 中括弧でパターンを区切った場合、Donal Fellowsに感謝します。 ), ...

でも、一緒にはできない。Ruby、JavaScript ( ただし、IE < 9を除く ), ...

m.buettnerさんのご指摘の通りです。 [^]] が曖昧でないのは ] 最初 の文字が含まれています。 [^a]] と表示されます。 でないものはすべて a の後に ] . を持つには a] と書く必要があります。 [^a\]] または [^]a]

特にJavaScriptの場合、仕様上 [] を正規表現トークンとして使用します。 決して がマッチする(言い換えれば [] は必ず失敗します)、そして [^] にマッチする正規表現として 任意の文字 . 次に [^]] は、次のように見えます。 に続く任意の文字 ] . 実際の実装は様々ですが、最近のブラウザは仕様の定義に従うのが一般的です。

パターンの詳細。

\[          # literal [
(?:         # open a non capturing group
    [^][]   # a character that is not a ] or a [
  |         # OR
    (?R)    # the whole pattern (here is the recursion)
)*          # repeat zero or more time
\]          # a literal ]

このパターンの例では、最後の ]

しかし、このパターンを少し最適化すると、同じことができます。 (を使用)。 (?-1) ) : (\[(?:[^][]+|(?-1))*+])

(                     # open the capturing group
    \[                # a literal [
        (?:           # open a non-capturing group
            [^][]+    # all characters but ] or [ one or more time
          |           # OR
            (?-1)     # the last opened capturing group (recursion)
                      # (the capture group where you are)
        )*+           # repeat the group zero or more time (possessive)
    ]                 # literal ] (no need to escape)
)                     # close the capturing group

またはそれ以上の (\[[^][]*(?:(?-1)[^][]*)*+]) を使用することで、交替のコストを回避することができます。