回答:
残念ながら、歴史的な理由により、ツールごとに正規表現の構文がわずかに異なります。また、一部の実装には、他のツールではサポートされない拡張機能がある場合があります。共通の根拠がありますが、すべてのツール作成者がいくつかの異なる選択をしたようです。
その結果、あるツールで機能する正規表現がある場合、別のツールで機能するように変更する必要がある場合があります。一般的なツールの主な違いは次のとおりです。
+?|(){}
バックスラッシュが必要かどうか。.[]*^$
を超えてサポートされる拡張機能と通常は+?|()
この回答では、主な標準をリストしています。詳細については、使用しているツールのドキュメントを確認してください。
ウィキペディアの正規表現エンジンの比較には、一般的な実装でサポートされている機能をリストした表があります。
基本的な正規表現は、POSIX標準によって体系化されています。grep
、sed
およびで使用される構文vi
です。この構文は次の機能を提供します。
^
そして$
、行の最初と最後でのみ一致します。.
任意の文字(または改行を除く任意の文字)に一致します。[…]
括弧内にリストされた任意の1文字(文字セット)に一致します。左大括弧の後の最初の文字がaの^
場合、リストされていない文字が代わりに一致します。を含めるには]
、開始の直後[
(または[^
負のセットの場合は後)に置きます。-
が2文字の間にある場合、範囲を示します。リテラルを含めるには、-
範囲として解析できない場所に置きます。^$.*\[
次の文字を引用符で囲む前にバックスラッシュを付けます。*
先行する文字または部分式に0回、1回以上一致します。\(…\)
*
演算子または後方参照と\DIGIT
置換で使用するための構文グループです。\1
、\2
、...、対応するグループにマッチした正確なテキストと一致する例えば\(fo*\)\(ba*\)\1
マッチfoobaafoo
ではなくfoobaafo
。10番目以降のグループを参照する標準的な方法はありません(の標準的な意味\10
は、最初のグループの後にが続き0
ます)。次の機能も標準ですが、一部の制限された実装にはありません。
\{m,n\}
間の直前の文字または部分式と一致Mへのn倍; nまたはmは省略でき、正確にmを意味します。\{m\}
[[:alpha:]]
。たとえば、任意の文字に一致します。ブラケット式の近代的な実装)のような照合要素とのような[.ll.]
同等クラスも含む[=a=]
。以下は一般的な拡張(特にGNUツール)ですが、すべての実装で見られるわけではありません。使用しているツールのマニュアルを確認してください。
\|
代替の場合:foo\|bar
一致foo
またはbar
。\?
(の略\{0,1\}
)および\+
(の略\{1,\}
)は、それぞれ最大で1回、または少なくとも1回、先行する文字または部分式に一致します。\n
改行、\t
タブなどに一致します。\w
単語の構成要素([_[:alnum:]]
ローカライズに関しては短縮形ですが)に\W
一致し、単語の構成要素ではない文字に一致します。\<
また\>
、単語の先頭または末尾でのみ空の文字列に一致します。\b
いずれかに\B
一致\b
し、一致しない場所に一致します。\|
演算子のないツールは、正規表現のすべての力を備えていないことに注意してください。後方参照を使用すると、数学的な意味で正規表現では実行できないいくつかの余分なことが可能になります。
拡張正規表現は、POSIX標準によって体系化されています。BREに対する主な利点は規則性です。すべての標準演算子は裸の句読点文字であり、句読点文字の前のバックスラッシュは常に引用符です。それはで使用される構文であるawk
、grep -E
またはegrep
、GNU sed -r
、およびbashのの=~
オペレーター。この構文は次の機能を提供します。
^
そして$
、行の最初と最後でのみ一致します。.
任意の文字(または改行を除く任意の文字)に一致します。[…]
括弧内にリストされた任意の1文字(文字セット)に一致します。初期値^
と範囲の補完は、BREのように機能します(上記を参照)。文字クラスを使用できますが、いくつかの実装にはありません。最新の実装では、等価クラスと照合要素もサポートしています。大括弧内のバックスラッシュは、すべてではありませんがいくつかの実装で次の文字を引用します。\\
移植性のためのバックスラッシュを意味するために使用します。(…)
は、置換*
または\DIGIT
置換用の構文グループです。|
代替の場合:foo|bar
一致foo
またはbar
。*
、+
および?
前の文字または部分式に何度も一致します:0以上の場合*
、1以上の場合+
、0または1の場合?
。{m,n}
間の直前の文字または部分式と一致し、MとN倍(一部の実装から欠落します)。nまたはmは省略でき、正確にmを意味します。{m}
\DIGIT
$0 ~ "(...)\\1"
\n
\t
\b
\B
\b
\B
PCREはEREの拡張であり、もともとPerlによって導入され、GNU grep -P
および多くの最新のツールとプログラミング言語で採用され、通常はPCREライブラリを介して行われます。例付きの素晴らしいフォーマットについては、Perlのドキュメントを参照してください。PCREでは、Perlの最新バージョンのすべての機能がサポートされているわけではありません(たとえば、Perlコードの実行はPerlでのみサポートされています)。サポートされている機能の概要については、PCREのマニュアルを参照してください。EREへの主な追加は次のとおりです。
(?:…)
は非キャプチャグループです:など(…)
ですが、後方参照にはカウントされません。(?=FOO)BAR
(lookahead)は一致BAR
しますがFOO
、同じ位置から開始するための一致もある場合のみです。これは、試合中に次のテキストを含めずに試合を固定するために最も有用である:foo(?=bar)
マッチfoo
それは続いていますが、場合にのみbar
。(?!FOO)BAR
(負の先読み)は一致BAR
しますがFOO
、同じ位置に一致するものはありません。たとえば(?!foo)[a-z]+
、foo
; で始まらない小文字の単語に一致します。[a-z]+(?![0-9)
数字が後に続かない小文字の単語に一致します(つまりfoo123
、一致しますfo
が一致しませんfoo
)。(?<=FOO)BAR
(後読み)は一致しますがBAR
、直前にが一致する場合のみですFOO
。FOO
長さがわかっている必要があります(などの繰り返し演算子は使用できません*
)。これは、マッチにマッチする前のテキストを含めずにマッチをアンカーするために最も便利です:(?<=^| )foo
マッチfoo
がスペースまたは文字列の先頭によって先行される場合のみ。(?<!FOO)BAR
(負の後読み)は一致しますがBAR
、の一致が直前にない場合のみですFOO
。FOO
長さがわかっている必要があります(などの繰り返し演算子は使用できません*
)。これは、マッチにマッチする前のテキストを含めずにマッチを固定するのに最も便利です:(?<![a-z])foo
マッチfoo
するのは小文字が前にない場合のみです。Emacsの構文は、BREとEREの中間です。Emacsに加えて、これは-regex
GNU findのデフォルトの構文です。Emacsは次の演算子を提供します:
^
、$
、.
、[…]
、*
、+
、?
EREのように\(…\)
、\|
、\{…\}
、BREのように\DIGIT
\<
そして、\>
単語の境界について、Emacsの最近のバージョンでは、Emacsに似た構文を持つ他のエンジンではサポートされないことがよくあります。シェルグロブ(ワイルドカード)は、正規表現とはまったく異なり、強力ではない構文でパターンマッチングを実行します。シェルに加えて、これらのワイルドカードはfind -name
、rsyncフィルターなどの他のツールで使用できます。POSIXパターンには次の機能が含まれます。
?
任意の1文字に一致します。[…]
一般的な正規表現の構文のような文字セットです。一部のシェルは、文字クラスをサポートしていません。一部のシェルでは、セットを無効にする!
代わりに必要です^
。*
(多くの場合を除き、任意の文字列に一致する/
ファイルパスを一致させる際、場合/
から除外され*
、そして**
時には含まれ/
ますが、ツールのマニュアルを参照してください)。Kshは、正規表現の全機能にパターンマッチングを提供する追加機能を提供します。これらの機能は、実行後にbashでも使用できますshopt -s extglob
。Zshの構文は異なりますが、の後のkshの構文もサポートできますsetopt ksh_glob
。
grep
、tw
、expr
...)を。ただしksh
、そのツールセットはAT&T以外ではめったに見つかりません。
regex(7)
あなたに同意し、[these]
「括弧表現」および(「括弧表現」内で)[:these:]
「文字クラス」と呼びます。どのように対処するのが最適かわかりません。
-
範囲を指定し、最初に(オプションの^
)後にエスケープするか、文字どおりに使用する場合は最後にエスケープする必要があることに注意してください。(たとえば[A-z]
、大文字と小文字の変更に注意してください。コード65〜122の文字に一致し、誤って次の各文字を含むバグがたくさんあります[\]^_`
。また[!-~]
、ANSIのすべての印刷可能文字に一致する有効かつわかりにくい文字もあります。、これは私のように見ることを好む[\x21-\x7e]
異なる次元の混乱しかしその作用に少なくとも簡単ですこれは、)。
vim
とAT&T libast(のようにksh93
)のものです。