1

次の正規表現について質問があります。

match = /^([^[]+?)(\[.*\])?$/.exec(path);

「?」の振る舞いがわかりません。最初の式:

^([^[]+?)

つまり、この式が独立した正規表現であり、パスが「abc[def]」である場合、「a」を match[1] として取得しますよね? (遅延一致のため)。ここで、2 番目の式を追加すると、match[1] は「abc」になります。違いを説明していただけますか?

ありがとう、リー

4

3 に答える 3

2

あなたが使用する場合、?あなたは実際に言っています、

  • するかもしれないし、しないかもしれない

  • lazyマッチング

ab?ありaまたはなしb(1回のみ)

しかし、この形式では:

a+?つまり、「a を検索してみてください。ただし、貪欲にならないでください」

したがって、[aaaaaaa] の最初の [a] のみがここで一致します。

編集

/^([^[]+?)/.exec("abc[def]");  //["a", "a"]

何故ですか ?

あなたが探しているから

最初から----すべてを含まず[、最小出現数を検索します。

それはあなたのa

しかし、あなたがやっているとき

/^([^[]+?)(\[.*\])?$/.exec("abc[def]");

あなたを混乱させているのは:

.*セカンドグループで。

于 2013-01-03T18:54:23.940 に答える
2

正規表現エンジンの動作を ungreedy にスワップした後?+デフォルトでは、エンジンは利用可能な最大の文字列を照合しようとします。末尾?を使用すると、最短を取得しようとします。

詳細については、http: //www.regular-expressions.info/repeat.htmlをご覧ください。

于 2013-01-03T18:56:13.513 に答える
1

orの?ような構造のは、その前にある演算子を非貪欲または怠惰な方法で動作させます。これは、(デフォルトのように) 可能な限り多くの文字を消費するのではなく、可能な限り少ない文字を消費することを意味します。+?*?

?ただし、この特定の正規表現では、動作を変更する文字列はありません。

/^([^[]+?)(\[.*\])?$/

最初のグループ([^[]+?)の後には文字列の末尾または a が続く必要があり[、最初のグループに a を含めることはできないため[、文字列全体 (含まれていない場合[) または最初の まで一致するか、または一致し[ません。全然合います。したがって、この場合、 の貪欲さ+は関係ありません。

于 2013-01-03T21:40:50.773 に答える