オンラインで読んだ内容では、見た目sed
に怠惰な一致があるため、理解しにくいです。
には、~/tmp/tmp.txt
2つのタブで区切られた3つの英数字文字列を含む行がありますTheQuick<TAB>BrownFox<TAB>JumpedOver
。を発行すると、そのsed -n -E '/^.+\t.+\t.+$/p' ~/tmp/tmp.txt
行が印刷されます。
私の考えでは、正規表現が2つのタブで区切られた3つの文字列と一致していても、その文字列は英数字ではないため、そうしないでください。したがって、最初の文字列は最初のタブに一致するものを残さず、その行のすべての文字を貪欲に食べる必要があります。
信頼できる正規表現を作成できるように、この動作をどのように理解する必要がありますか?私はGNUを使用していますsed
。
答え1
貪欲なマッチングシステムは、単に最大のものを見つけようとすることを意味します。マッチ文字列(意味最初max では、一致する文字列があっても一致しない文字列で停止するのではなく、正規表現全体の最初の一致で検索を停止します。 「できるだけ一致するものを見つけてください。しかし、私に合ったものを探してください!」というコマンドで考えてください。最初の項目が.\+
文字列全体を食べることを許可すると、正規表現が一致しないことを意味するので、エンジンは戻って別のことを試みます。
あなたの場合、正規表現を行の始めと終わり(^
および$
)に固定するので、正規表現に.+
異なる内容があるため、行の終わりまで到達できないため、はるかに簡単です。
グリディマッチングを説明するのに役立つ例は次のとおりです。
$ echo aaaaaaa | sed 's/a*/B/'
B
ここで正規表現はa*
「ゼロ個以上の連続したa
文字と一致」を意味するので、貪欲な一致は可能な限り大きいものを探します。マッチひも。貪欲ではない一致(PCREなど)は、以下を返します。
$ echo aaaaaaa | perl -pe 's/a*?/B/'
Baaaaaaa
non-greedy は、最も長い文字列の代わりに最短の一致文字列を見つけるためです。
英数字に言及した理由やそれがどのような関係があるのか理解できません。たぶんあなたは誤解し、.
英数字の文字列だけに一致すると思ったかもしれませんが、そうではありません。.
(使用する正規表現スタイルと提供するオプションによっては改行文字とも一致することがあります。)英数字文字列が必要な場合は、一致する[[:alnum:]]
POSIX文字クラスを使用できます[a-zA-Z0-9]
。