次の正規表現について質問があります。
match = /^([^[]+?)(\[.*\])?$/.exec(path);
「?」の振る舞いがわかりません。最初の式:
^([^[]+?)
つまり、この式が独立した正規表現であり、パスが「abc[def]」である場合、「a」を match[1] として取得しますよね? (遅延一致のため)。ここで、2 番目の式を追加すると、match[1] は「abc」になります。違いを説明していただけますか?
ありがとう、リー
あなたが使用する場合、?
あなたは実際に言っています、
するかもしれないし、しないかもしれない
lazy
マッチング
ab?
ありa
またはなしb
(1回のみ)
しかし、この形式では:
a+?
つまり、「a を検索してみてください。ただし、貪欲にならないでください」
したがって、[aaaaaaa] の最初の [a] のみがここで一致します。
/^([^[]+?)/.exec("abc[def]"); //["a", "a"]
何故ですか ?
あなたが探しているから
最初から----すべてを含まず[
、最小出現数を検索します。
それはあなたのa
しかし、あなたがやっているとき
/^([^[]+?)(\[.*\])?$/.exec("abc[def]");
あなたを混乱させているのは:
.*
セカンドグループで。
正規表現エンジンの動作を ungreedy にスワップした後?
。+
デフォルトでは、エンジンは利用可能な最大の文字列を照合しようとします。末尾?
を使用すると、最短を取得しようとします。
詳細については、http: //www.regular-expressions.info/repeat.htmlをご覧ください。
orの?
ような構造のは、その前にある演算子を非貪欲または怠惰な方法で動作させます。これは、(デフォルトのように) 可能な限り多くの文字を消費するのではなく、可能な限り少ない文字を消費することを意味します。+?
*?
?
ただし、この特定の正規表現では、動作を変更する文字列はありません。
/^([^[]+?)(\[.*\])?$/
最初のグループ([^[]+?)
の後には文字列の末尾または a が続く必要があり[
、最初のグループに a を含めることはできないため[
、文字列全体 (含まれていない場合[
) または最初の まで一致するか、または一致し[
ません。全然合います。したがって、この場合、 の貪欲さ+
は関係ありません。