正規表現 grep -r 'emm*[af].[^ta]$'

正規表現 grep -r 'emm*[af].[^ta]$'

私は1時間前にgrepコマンドを使って正規表現について同様の質問をしました。同じスレッドに投稿することが望ましいオプションである場合は、ご容赦ください。それなら、次にそうします。

基本的な構成のように見えるかもしれませんが、正規表現認識パターンがどのように機能するかを理解しようとしています。 (資料を正しく解釈できなかったようです。)。

ファイルには次の単語のリストが含まれています。

mael@mael-HP:~/repertoireVide$ cat MySQLServ
remembré
emmuré
emmené
dilemmes
jumeaux
écrémage
emmena
emmailloter
flemmard

次のコマンドは出力を提供します

mael@mael-HP:~/repertoireVide$ grep -r 'emm*[a-f].[^ta]$'
MySQLServ:remembré
MySQLServ:emmené
MySQLServ:flemmard

grep「emmailloter」のために「emmailloter」という単語が一致しない理由を知りたいです。

  1. 「em」が含まれています。
  2. [af]の間に文字が続きます: 'a'
  3. 「I」は「。」コンポーネントを満たしています。
  4. 文字「t」または「a」で終わらない。

ありがとうございます。

答え1

単語には、一致するビットの間にあるemmailloterよりもはるかに多くの内容が含まれています。iこのパターンは単一の文字にのみ一致するため、末尾と複数の文字を一致させるには複数の文字を許可する必要があります。[a-f][^ta]$.emmar

emm*[a-f]..*[^ta]$

grep -E(拡張正規表現を有効にする)を使用すると、「少なくとも1文字と一致する」と書く..*ことができます。.+式は..*「1文字にマッチし、次にそれ以上の文字にマッチする」と読みます。同様に、使用される場合emm*に置き換えることができますem+。つまり、「e次に少なくとも1つ」が続きます。mgrep -E

これは文字列と一致します

blop-emmmmmmmmma-blarg-b
     ^^^^^^^^^^^^^^^^^^^
     1111111111233333334

1: emm*
2: [a-f]
3: ..*
4: [^ta]$

(上記の文字で表される一致部分^)たとえば、次のようになりますemmailloter

emmailloter
^^^^^^^^^^^
11123333334

テスト:

$ grep -E 'emm*[a-f].+[^ta]$' MySQLServ
remembré
emmené
emmailloter
flemmard

単語の場合、一致remembréは次のとおりです。

remembré
 ^^^^^^^
 1123334

いいえ

remembré
   ^^^^^
   11234

一つの方法はイメージ一致する用途sed:

$ sed -n -E 's/(emm*)([a-f])(.+)([^ta]$)/(\1)(\2)(\3)(\4)/p' MySQLServ
r(em)(e)(mbr)(é)
(emm)(e)(n)(é)
(emm)(a)(illote)(r)
fl(emm)(a)(r)(d)

これにより、一致する行のみが印刷され、正規表現の一致する各部分は括弧で囲まれます。また、これはフランス語の文字を一致させるために使用できる実装を使用しており、sedそのためにロケール環境変数が正しく設定されていると仮定します。

これを元の式で生成された結果と比較します。

$ sed -n -E 's/(emm*)([a-f])(.)([^ta]$)/(\1)(\2)(\3)(\4)/p' MySQLServ
rem(em)(b)(r)(é)
(emm)(e)(n)(é)
fl(emm)(a)(r)(d)

関連情報