2017-01-31 19 views
3

正規表現の逆参照の大文字の小文字のバージョンと一致させたいと思います。たとえば、最初の文字が大文字の文字列で、4番目の文字が小文字以外の最初の文字と同じ文字列と一致するようにしたいとします。私はこの正規表現でgrepを使用する場合:逆参照の小文字のバージョンと一致させる方法

grep -E "([A-Z])[a-z]{2}\1[a-z]" 

それは、例えば"EssEx""SusSe"にマッチします。代わりに"Essex""Susse"と一致させたいと思います。これを達成するために上記の正規表現を変更することは可能ですか?

+0

「[A-Z] [a-z] {4}」 ' –

+1

「Esssx」にも一致します。逆参照にある同じ文字の小文字のバージョンの場合にのみ、それを一致させたいだけです。例えば、 'A'の' a'、 'Q'の' q'です。その他の小文字はありません。 –

+3

インライン修飾子はサポートされていますか?そうであれば、良い古い '([A-Z])[a-z] {2}(?i)(?!\ 1)(?i)\ 1 [a-z] *'が動作します。 –

答えて

2

これは、インライン修飾子が便利になる例です。

([A-Z])[a-z]{2}(?-i)(?!\1)(?i)\1[a-z] 

なお:ここでは大文字と高感度に影響先読みの使用をチェックすることができます解決策は、フィッティング小文字を一致させるために同じ(大文字)文字と、大文字と小文字を区別しない後方参照が正確でないこと、です(?-i)は必要性はほとんどありませんが、分かりやすくするためにそこにあります。インライン修飾子はすべての正規表現フレーバでサポートされていません。 PCREはそれをサポートしているので、grepで-Pを使用する必要があります。

2

それはより冗長になりますが、このawkは仕事をしていません:

awk '/([A-Z])[a-z]{2}/ && tolower(substr($1, 1, 1)) == substr($1, 4, 1) && 
    substr($1, 5) ~ /[a-z]/' file 

Essex 
Susse 
+2

私は年齢のためにここにあなたを見たことがない、バム、あなたは一緒に来て、私たちのために光を輝かせるのは単なる人間です! – Martin

+1

期待どおりに動作します! –

関連する問題