交互に最短一致を選択する方法はありますか?

交互に最短一致を選択する方法はありますか?

私の考えでは、grepとawkはNFA(非決定的)正規表現マシンを使用しているということです。
このページの中央にある画像は次のとおりです。正規表現の一致は簡単で高速です。これが実際に真であることを確認してください。

最初のシフトが一致すると、NFAの実装が中断される可能性があることが知られています。たとえば、リンクされた記事のNFAマシンは次のとおりです。たとえば、abab | abbbのNFAを考えてみましょう。:

ここに画像の説明を入力してください。

正規表現は、abab|abbb最初の正規表現と一致すると、文字列の右側と一致する状態に達します。このとき、終了点に達してマッチング状態に達すると停止する(S10)。別の一致があっても追加の入力をテストする必要はありません。ababbbbabababbb

つまり、このコードでは次のようになります。

echo 'catfish' | grep -Eo 'cat|catfish'

結果はでなけれcatばなりませんがcatfish。交換の有無にかかわらず、結果は同じです。

grep正規表現エンジンが常に最長の一致を見つけるのはなぜですか?

そして、デフォルト値を変更できますか?

ベストアンサー1

標準では最長のマッチングが要求されるため、POSIX準拠のORでgrepこれを行う方法はないと思います(例えば、マンページを参照)。awkregex(7)

たとえば、プログラムと正規表現を変更して、目的のawk出力を得ることができます。awk

echo 'SetValue' | awk '{ if (match($0, /Set(Value)?/)) { print substr($0, RSTART, 3); }

この場合、以下pcregrepを使用して番号付きサブグループを指定できるpcre perl準拠の正規表現ライブラリの一部を使用します-o

echo SetValue | pcregrep -o1 '(Set)(Value)?'

または、PCREには貪欲ではない一致構文があるため、

echo SetValue | pcregrep -o0 'Set(Value)??'

おすすめ記事