角かっこ拡張の代わりに置換を使用すると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つのスペースがあります)。その'ため、その文字を含めました。明らかに、その文字を含むテキストを一致させたいからです。

答え2

最初の例:

大文字の後に任意の数の大文字または小文字を探し、0から無限に繰り返されます。ただし、あなたの文にはスペースと句読点(')が含まれています。正規表現は非常に強力ですが、達成したい目標に適したツールではないと思います。まず、文章は様々な句読点で終わることができます。さらに、文に含めることができる文字には事実上制限はありません。

私は常にrmで「--」を使用する必要があると言った人がStéphaneだと思います!

これは単なる文章ではありませんか?

2 番目の例で空白が必要な理由は、最初の例が機能しない理由と同じです。文にスペースがあります。

次のものを使用できます。

[A-Z](\s|\S)+[.!?]

ただし、これは大文字(英語)文字で始まり、句読点で終わるすべての項目と一致するだけであり、それらの間の項目は実際には考慮されません。

または、次の文章はどうですか?

iTunesは私が好きではない音楽プレーヤーです。

関連情報