\とは何ですか?正規表現の意味ですか?


16

次のコマンドを使用して、7桁の電話番号を検索します。

grep "[[:digit:]]\{3\}[ -]\?[[:digit:]]\{4\}" file

何の\?略ですか?

回答:


21

のような ?、他の多くの正規表現エンジンでは、と手段「が一致ゼロまたは任意の一つは、その前に来ました」。

あなたの例では、\?はに適用され、[ -]スペースまたはマイナスに一致させようとしますが、スペースまたはマイナスはオプションです。

したがって、これらのいずれかが一致します。

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 \).

詳細情報:


egrepコマンドは同等ですgrep -E。GNU grep以外のバージョンでgrepは、-Eオプションを受け入れる場合と受け入れegrepない場合があり、別個のプログラムである場合があります。
キーストンプソン

@KeithThompson grep -Eは、公式のPOSIXの方法です。egrepsusv2(1997)で廃止され、susv3(2001)でPOSIXおよびUnix仕様から削除されました。
ステファンシャゼル14

1
\?しかし、GNUismです。
ステファンシャゼル14

8

残念ながら、正規表現の正確な構文はプログラムによってわずかに異なります。grepの正規表現はsedの正規表現とまったく同じではなく、Emacsの正規表現とまったく同じではありません。オン。さらに悪いことに、grepのような「標準」ツールでさえ、Unixのような異なるオペレーティングシステム間でわずかに異なる場合があります。

正規表現では、一部の文字には特別な意味(例の角かっこなど)があり、バックスラッシュを前に置いて「エスケープ」するとリテラル文字としての通常の意味に戻ります(そのため、リテラルブラケットは\ [)と書かれています。他の方法は別の方法で動作し、エスケープされた場合にのみ特別な意味を持ちます(たとえば、nは単なる文字ですが、\ nは改行です)。また、これらは正規表現の実装によって異なる場合があります。

ほとんどの正規表現の実装では、疑問符は前の項目がオプションであることを意味し、エスケープされた疑問符(\?)はリテラルの疑問符です。しかし、いくつかの方言では、その逆です。あなたの例はどちらの方法でも意味がありますが、あなたは方言の1つを持っていると思いますか?リテラルおよび\?はオプションのシンボルです。したがって、正規表現はおそらく「3桁、オプションで後にスペースまたはダッシュが続き、その後に4桁が続く」ことを意味します。

(別の手がかりは、\ {3 \}のような構造に見られます。これは、「前の項目の正確に3つ」を意味することを明確に意図しています。ほとんどの正規表現方言では、これは{3}と記述され、\ {は中括弧です)


6

これは、他の回答に既に含まれている情報の簡単な要約です。

で、リテラルの疑問符文字grep?一致し、\?それに先行するものがゼロまたは1回出現することを示します。あなたの質問の例では、[ -]\?は、スペース、ハイフン、または何も一致しません。

ではegrepまたはgrep -E、それは周りの他の方法です。\?文字通りの疑問符に一致し、? 0回または1回の出現示します。

これはGNU grepに適用されます。GNU以外のgrep実装の詳細はわずかに異なる場合があります。特に、grepそしてegrep歴史的に二つの別々のプログラムだった、と私は古い考えていないgrepのが持っていた-Eオプションを選択します。POSIXは指定しますgrep -Eが、(私は驚いたことに)言及していませんegrep

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.