回答:
のような ?
、他の多くの正規表現エンジンでは、と手段「が一致ゼロまたは任意の一つは、その前に来ました」。
あなたの例では、\?
はに適用され、[ -]
スペースまたはマイナスに一致させようとしますが、スペースまたはマイナスはオプションです。
したがって、これらのいずれかが一致します。
555 1234
555-1234
5551234
として書かれている理由 \?
?
が後方互換性のためではなく、。
元のバージョン grep
、「基本的な正規表現」と呼ばれる異なるタイプの正規表現使用しましたが、?
これは文字通りの疑問符を意味していました。
GNU grepがゼロまたは1つの機能を持つことができるように、彼らはそれを追加しましたが、 \?
スクリプトが?
期待どおりに構文。
grepには -E
「拡張正規表現」と呼ばれるより一般的なタイプの正規表現を使用オプションます。
man 1 grep
:
-E, --extended-regexp
Interpret PATTERN as an extended regular expression
(ERE, see below). (-E is specified by POSIX.)
-G, --basic-regexp
Interpret PATTERN as a basic regular expression (BRE, see below).
This is the default.
...
Repetition
A regular expression may be followed by one of several repetition operators:
? The preceding item is optional and matched at most once.
...
grep understands three different versions of regular expression syntax:
“basic,” “extended” and “perl.”
...
Basic vs Extended Regular Expressions
In basic regular expressions the meta-characters ?, +, {, |, (, and )
lose their special meaning; instead use the backslashed versions
\?, \+, \{, \|, \(, and \).
詳細情報:
grep -E
オプションと egrep
grep -E
は、公式のPOSIXの方法です。egrep
susv2(1997)で廃止され、susv3(2001)でPOSIXおよびUnix仕様から削除されました。
\?
しかし、GNUismです。
残念ながら、正規表現の正確な構文はプログラムによってわずかに異なります。grepの正規表現はsedの正規表現とまったく同じではなく、Emacsの正規表現とまったく同じではありません。オン。さらに悪いことに、grepのような「標準」ツールでさえ、Unixのような異なるオペレーティングシステム間でわずかに異なる場合があります。
正規表現では、一部の文字には特別な意味(例の角かっこなど)があり、バックスラッシュを前に置いて「エスケープ」するとリテラル文字としての通常の意味に戻ります(そのため、リテラルブラケットは\ [)と書かれています。他の方法は別の方法で動作し、エスケープされた場合にのみ特別な意味を持ちます(たとえば、nは単なる文字ですが、\ nは改行です)。また、これらは正規表現の実装によって異なる場合があります。
ほとんどの正規表現の実装では、疑問符は前の項目がオプションであることを意味し、エスケープされた疑問符(\?)はリテラルの疑問符です。しかし、いくつかの方言では、その逆です。あなたの例はどちらの方法でも意味がありますが、あなたは方言の1つを持っていると思いますか?リテラルおよび\?はオプションのシンボルです。したがって、正規表現はおそらく「3桁、オプションで後にスペースまたはダッシュが続き、その後に4桁が続く」ことを意味します。
(別の手がかりは、\ {3 \}のような構造に見られます。これは、「前の項目の正確に3つ」を意味することを明確に意図しています。ほとんどの正規表現方言では、これは{3}と記述され、\ {は中括弧です)
これは、他の回答に既に含まれている情報の簡単な要約です。
で、リテラルの疑問符文字grep
に?
一致し、\?
それに先行するものがゼロまたは1回出現することを示します。あなたの質問の例では、[ -]\?
は、スペース、ハイフン、または何も一致しません。
ではegrep
またはgrep -E
、それは周りの他の方法です。\?
文字通りの疑問符に一致し、?
0回または1回の出現示します。
これはGNU grepに適用されます。GNU以外のgrep実装の詳細はわずかに異なる場合があります。特に、grep
そしてegrep
歴史的に二つの別々のプログラムだった、と私は古い考えていないgrep
のが持っていた-E
オプションを選択します。POSIXは指定しますgrep -E
が、(私は驚いたことに)言及していませんegrep
。
egrep
コマンドは同等ですgrep -E
。GNU grep以外のバージョンでgrep
は、-E
オプションを受け入れる場合と受け入れegrep
ない場合があり、別個のプログラムである場合があります。