角かっこ拡張の代わりに置換を使用するとgrepで結果が得られないのはなぜですか?

角かっこ拡張の代わりに置換を使用するとgrepで結果が得られないのはなぜですか?

この場合、結果が得られない理由を知りたいです。

echo "This doesn't work." | grep -E '[[:upper:]]([[:upper:]] | [[:lower:]])*\.'

私はGrepで正規表現を学んでいますが、ここでやりたいことは入力が文であるかどうかを検出することです。これを行うには、拡張オプションでgrepを使用し、大文字で始まり、その後に大文字と小文字の数が続き、ピリオドで終わるすべての入力を一致させようとします。問題は、入力が一致せず、その理由を理解できないことです。

実際の例は次のとおりです。

echo "This works." | grep -E '[[:upper:]][[:upper:][:lower:] ]*\.'

なぜ私たちに必要なのですか?閉じる前に2番目の角かっこ拡張の[:lower:]の後にスペースがありますか?なぜ仕事に必要なのですか?

ベストアンサー1

あなたの表現には基本的に2つの「誤り」があります。まず、一致することは許可されていません'。第二に、([[:upper:]] | [[:lower:]])*同様の文字列が一致しますA A   a a(たとえば、一連の大文字の後にスペースが続く場合、または一連の小文字の後にスペースが続く場合など)。

文字列を一致させThis doesn't work.、大文字Tとドットを明示的に一致させ、大文字、小文字、スペース、および'それらの間のすべての項目を一致させるために必要な事項は次のとおりです。

$ echo "This doesn't work." | grep -E "[[:upper:]]([[:upper:]]| |'|[[:lower:]])*\."
This doesn't work.

これは次のように書く方が良いです。

$ echo "This doesn't work." | grep "[[:upper:]][[:upper:][:lower:]' ]*\."
This doesn't work.

[:upper:]この場合、2番目の項目は実際にテスト文字列によってトリガされていなくても使用できます[[:upper:]][[:lower:]' ]*\.。)

括弧で囲まれた式内のスペースは、テキストの実際のスペースと一致することができます。そのスペースがないと、パターンは一致しません(テスト文字列に2つのスペースがあります)。その'ため、その文字を含めました。明らかに、その文字を含むテキストを一致させたいからです。

おすすめ記事