適切な例をいくつか挙げて、正規表現に対する 2 つのアプローチの違いを理解するのに役立つ人はいますか?
- よく深い
- 貪欲でない
ありがとう
貪欲なアプローチでは、正規表現パターンはソース文字列の最大文字数を消費する傾向があります.たとえば
textstr = "bcabdcab"
textstr.gsub!(/(.*)ab/, "xxx")
# this will match whole `bcabdcab` and return `xxx`
ここ*
に貪欲な量指定子があります。非貪欲なアプローチでは、正規表現エンジンは一致基準を満たすときに戻ります。量指定子を非貪欲に追加するには?
textstr = "bcabdcab"
textstr.gsub!(/(.*?)ab/, "xxx")
# this will match only `bcab` part and return `xxxdcab`
gsub
2 番目の引数をすべての pattern に置き換えた str(1 番目の引数) のコピーを返します
Chekout http://www.regular-expressions.info/repeat.html。
貪欲とは、正規表現エンジンが特定の文字セットとの一致を試行する回数を指します。正規表現の「貪欲さ」を表す方法は、特殊文字*
、+
、?
およびを使用すること{}
です。
検討
str = "asdfasdfbbbb"
r1 = /b/
r2 = /(asdf)*/
r3 = /b{3}/
r4 = /.*/
これらの正規表現をstrと 照合すると、次のようになります。
r1マッチング"asdfasdf b bbb" (非貪欲、bとのマッチングを 1 回だけ試行)
r2マッチング" asdfasdf bbbb" (貪欲、可能な限りasdfとのマッチングを試みる)
r3マッチング"asdfasdf bbb b" (非貪欲、bは正確に 3 回一致します) r4
は" asdfasdfbbbb "に一致します (超貪欲、ほぼすべての文字に可能な限り何度でも一致します)
正規表現は特定のテキスト パターンを表す手段であるため、貪欲とは異なり、アプローチの問題です。foo ( ) の 3 回またはbar ( )/(foo){3}/
の無限回の一致が必要になる場合があります。/(bar)*/
*
- (0 以上) 貪欲なマッチング+
- (1 つ以上) 貪欲なマッチング*?
- (0 以上) 非貪欲なマッチング+?
- (1 つ以上) 非貪欲なマッチング