正規表現の定義は何ですか?


10

私は最近、この質問に対する私の回答へのコメントの正規表現を構成するものについて、Ghotiとの友好的な議論に入りました。私は以下が正規表現であると主張しました:

`[Rr]eading[Tt]est[Dd]ata`

Ghotiは同意せず、代わりにファイルグロブであると主張した。ウィキペディアのglobページは、次のように述べています(私の強調):

Globsには、式の前の部分を複数回繰り返すことができるKleeneスターの構文は含まれていません。したがって、これらは正規表現とは見なされません。これは、特定の有限アルファベットよりも多くの正規言語を記述することができます。

ただし、この主張に対する引用はなく、これは特定のWikipedia編集者の意見にすぎないことを示しています。

The Single UNIX®Specification、Version 2では、基本正規表現(BRE)は単一の文字でさえ可能であると述べています:

通常の文字とは、それ自体に一致するBREです。サポートされている文字セットの任意の文字。ただし、BRE特殊文字にリストされているBRE特殊文字は除きます。

それで、* nixの世界での正規表現の定義は何ですか?その定義はファイルグロブを除外しますか?


6
理論上のCSでは、正規表現は正規オートマトンで認識できる正規言語の記述です。Unixの世界では、はるかに複雑であり、単一の定義はありません。そこPOSIX仕様で2つの正規表現の方言です:拡張と基本的な、のようなツールによって使用されているgrepsedawk。Perlと同様に、Vimは独自の種類を使用します。
jw013 2012

それで、その定義により、ファイルグロブ BREですよね?
terdon

2
いいえ、ファイルグロブはBREではありません -それは何だと思いますか?BREのPOSIXの説明とグロビングのPOSIXの説明を読むと、同じではないことがわかります。たとえば*、BREとグロブでは2つの異なる意味があります。注:グロブという用語はPOSIX仕様のどこでも使用されているとは思いません。代わりにパターンマッチングと呼ばれ、シェル言語の章で説明されています。
jw013 2012

回答:


10

lk-が言ったように-nameオプションはfind引数を正規表現ではなくグロブとして扱います。

文字列がグロブまたは正規表現として解釈されるか、単なるプレーン文字列として解釈されるかは、解釈に何が使用されているかに依存します。それは状況の問題です。あなたの例では、文字列は、[Rr]eading[Tt]est[Dd]ata異なるいくつかの方法で評価したが、何それは可能なのは、あなたがそれを使用している方法によって異なります。グロブとして使用してください。グロブです。正規表現として使用します。正規表現です。これが発生した問題の場合、OPは文字列を正規表現として説明しました。したがって、彼がそれを正規表現として解釈することを計画していたと想定できます。

絶対に、1文字が正規表現になることもあります。文字列にすることも、グロブにすることもできます。必要に応じて、バイトまたはtinyintとして解釈できます。それはすべてコンテキストに依存します。

さまざまな形式の正規表現には多くの仕様があります。BREとEREは十分に文書化されています。PCREは、機能のSCADを追加します。多くの正規表現インタープリターは、例えば、「EREのすべてとPCREの一部」を実装します。または、EREから一部の機能を除いて実行します。あなたが正式な仕様で行くと、多くの多くのツールが正規表現サポートを主張しますが、それは正しくないか不完全であることが判明します。詳細を知ることで、正規表現を評価しているツール内で利用可能な機能のコレクションにソリューションを適合させることができます。

つまり、グロブを「除外する」定義を探しているのであれば、これを間違った視点から見ていることになります。 を使うかで決まります


7

[Rr]eading[Tt]est[Dd]ataグロブと正規表現の両方として有効であるように見え、両方の解釈で同じ「意味」があると思います。ただし、-nameオプションはfind引数を正規表現ではなくグロブとして扱います。

この区別は、のような引数を提供する場合に重要になりますfoo*。これは、有効なグロブと有効な正規表現の両方ですが、解釈によって意味が異なります。

グロブパターンとして解釈した場合、これは一致しますfoofoobarfoo123、など

正規表現として解釈した場合、これは一致しますfofoofoooooo、など


ありがとう、グロブパターンと正規表現の違いがわかります。しかし、正規表現の正式な定義は何ですか?
terdon

1
「正規表現」という用語が一般的に使用されているため、単一の定義があるかどうかはわかりません。POSIX正規表現やPerl正規表現などのさまざまな構文仕様があり、後方参照や先読みなどの他の「機能」が含まれています。これらは、厳密な意味ではもはや正規表現ではない可能性がありますが(正規形式言語のコンテキストでは)、依然としてそのように呼ばれます。
lk- 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.