これは「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:]]*\.'