拡張正規表現の説明

拡張正規表現の説明

これは「Linux Command Line」の本の例です。

(555)123-4567または555 123-4567を一致させようとすると、次の拡張正規表現を使用できます。

^\(?[0-9][0-9][0-9]\)?  [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$

簡素化

^\(?[0-9]{3}\)?  [0-9]{3}-[0-9]{4}$

最初の例では、2番目の例は?に含まれる完全な式に適用されますか?つまり、また()はと一致するという意味です。555(555)

2番目の例では、次のようになります。

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

アスタリスクは*完全な式に適用されますか、それとも親クラスと子文字クラスを含む式の2番目の部分にのみ適用されますか?

前の式が次のような場合:

grep -E '[[:upper:][:upper:]][:lower:]*\.'

*サブキャラクタークラスにのみ適用されますか?

答え1

TheophrastusとSteeldriverのコメントの要約(この回答を自由に編集できます)といくつかのコメント:

最初の例では、2番目の例はどうですか? ()に含まれる完全な式に適用されますか?つまり、555 または (555) と一致します。

2つ目は?閉じる(エスケープ)に適用され、1)つ目は?開く(エスケープ)に適用されます(。どちらの場合もリテラル文字と一致します。また、正規表現の後には1つの空白文字ではなく2つの空白文字があるため、入力例と一致する?ようにスペースを削除する必要があります。

正規表現は次のように一致します(空白文字を1つ削除)。

(555) 123-4567
(555 123-4567
555) 123-4567
555 123-4567

グループを一致させるには、拡張正規表現で括弧をエスケープしないでください。

555例とオプションのグループでは、次のスペースと一致します。

$ echo -e "555 123-4567\n123-4567" | grep -E '^([0-9]{3} )?[0-9]{3}-[0-9]{4}$'
555 123-4567
123-4567

* アスタリスクは完全な式に適用されますか、それとも親クラスとサブキャラクタクラスを含む式の2番目の部分にのみ適用されますか?

はい、角かっこ式でのみ機能します[[:upper:][:lower:] ]

grep -E '[[:upper:][:upper:]][:lower:]*\.'

*サブキャラクタークラスでのみ機能しますか?

はい、スペルエラーがない場合は可能です。低い文字クラスの場合は、2 つの角かっこが必要ですが、これは[[:upper:][:upper:]]意味がありません。一つで[[:upper:]]十分です。

そうなるだろう

grep -E '[[:upper:]][[:lower:]]*\.'

関連情報