2016-10-15 14 views
1

を一致させるために必要とされる理由を私は句と私はJavascriptの正規表現 - 終端スペースは文字列全体

id BETWEEN 3 and 10 
に対して一致しています次のJavaScript( regex

(?:(?:(between)(['"]?)(.*?)(\2)(and)(['"]?)(.*?)(\6))) 

を持つSQLを解析しています

この正規表現が機能するには、正規表現の最後に\sまたは\s+を追加し、一致する文字列の最後にスペースを入れなければなりません。

(グループ7のキャプチャで)文字列の一部である10と一致させるために、この余分なスペースのマッチングが必要な理由を説明できますか?この正規表現は、SQLフィルタを解析するために使用されるlarger regexから抽出されること

注:第6群

(?:(?:(between)(['"]?)(.*?)(\2)(and)(['"]?)(.*?)(\6)))
(\(*)([\w][\w\d.]*)\s*([<>!=]{1,2}|like|not like|is null|is not null|in\s*\()?\s*(?!and|or)(?:(?:(between)(['"]?)(.*?)(\5)(and)(['"]?)(.*?)(\9))|(?:(['"]?)(.*?)(\12)))\s*(\)*)\s+(?!'|")\s*(and|or)?\s* 
+0

を参照してください。したがって、 '。*?'はパターンの最後にあり、怠惰なパターンであり、一致することができる文字の最小量、つまりここではゼロと一致します。あなたが一致する必要があるものをさらに明確にすることなく、私は何も示唆することはできませんが、間違いなく '。*? 'はもっと貪欲なものに置き換えなければなりません。本当のパターンは何ですか? –

+0

@WiktorStribiżew - 私は、より大きなパターンとmysqlフィルタを解析するために使われるリンクを含んでいます。 – mseifert

+0

空の文字列の逆参照を境界として使用することはできないため、この方法には一定の問題があります。交互に使用し、区切られた部分を1つのキャプチャグループに取り込み、非空白のシーケンスを別のものに取り込む必要があります。 –

答えて

1

、 - (['"]?)は - 空の文字列にマッチします。したがって、.*?(7番目のグループ)はパターンの最後に表示され、遅延パターンであり、一致できる文字の最小量、つまり0と一致します。

/I have a .*?/のような正規表現を考えて、I have a cat文字列(demo hereを参照)に対して試してみてください。正規表現ではI have aが見つかった後、.*?の部分は、改行文字以外の0個以上の文字に一致します可能な限り - catの直前の空白に一致します。これは怠け者の定量化の仕組みです。パターンが一致し、失敗した場合にのみ、怠惰なパターンが "展開"します。つまり、一致するように試みます。パターンの最後に怠惰​​なパターンは、それらが一致する必要がある文字の最小量を一致させる理由は次のとおりです。.+?はわずか1文字にマッチします、と.*?は0

数量がどのように動作するか怠惰の詳細についてはGreedy vs. Reluctant vs. Possessive Quantifiersを参照してくださいにマッチします。

空の文字列を逆参照することはできませんので、代替グループを使用して、"'の区切り文字列を1つのキャプチャグループに、空白以外のシーケンスを別のグループにキャプチャする必要があります。

Besdies、パターンの終わりに近い\s+は空白で終了しない文字列を可能にするために\s*に変更する必要があります。

(\(*)(\w[\w.]*)\s*([<>!=]{1,2}|like|not like|is null|is not null|in\s*\()?\s*(?!and|or)(?:(?:(between)(?:(['"])(.*?)(\5)|(\S+))(and)(?:(['"])(.*?)(\10)|(\S+)))|(?:(['"])(.*?)(\14)|(\S+)))\s*(\)*)\s*(?!'|")\s*(and|or)?\s* 

それは第六グループが空の文字列と一致していることを、実際には明らかですthis regex demo

+0

優れています。私があなたの説明に感謝します。彼らが失敗したときだけ、怠け者のパターンは境界線の周りの繊細さと同様に "拡大"します。私はまだ正規表現で比較的新しいですし、これらの細かい点はすべての違いを作ります。 – mseifert

関連する問題