との差 '。' 、 '?' および正規表現の「*」


21

これらの3つの要素(これらはメタキャラクターと呼ばれますか?)がどのように異なるかについての例を得ることができますか?

私はそれが*すべてか何も意味しないことを知っていますが、それについて考える正しい方法であるかどうかはわかりません。一方.?同じように見えます。それらは1文字に一致しますよね?



@Cyrusまたはそれ以上:StackOverflow Regex Documentation
トーマスアユーブ

回答:


16

ウィキペディアから直接撮影:

? 疑問符は、先行する要素が0回または1回出現することを示します。たとえば、colou?rは「色」と「色」の両方に一致します。

*アスタリスクは、先行する要素のゼロ個以上の出現を示します。たとえば、ab * cは「ac」、「abc」、「abbc」、「abbbc」などに一致します。

大きな違いは、アスタリスクがゼロまたは1以上の出現に一致するのに対し、疑問符はゼロまたは1回の出現に一致することです。これら2つの例を比較します。

$ printf "colour\ncolor\ncolouur\n" | egrep 'colou?r'                          
colour
color
$ printf "colour\ncolor\ncolouur\n" | egrep 'colou*r'                          
colour
color
colouur

であるためcolouur、文字のu(修飾子の前に前の要素?)複数回発生し、それが一致しないです?が、それはと一致します*

同様の例:

$ printf "error\neror\ner\n" | egrep 'er?or'                                   
eror
$ printf "error\neror\ner\n" | egrep 'er*or'                                   
error
eror

同じウィキペディアのページから:

任意の単一文字に一致します(多くのアプリケーションは改行を除外し、正確にどの文字が改行と見なされるかはフレーバー、文字エンコード、およびプラットフォーム固有ですが、改行文字が含まれていると想定しても安全です)。POSIXブラケット式内では、ドット文字はリテラルドットと一致します。たとえば、acは「abc」などに一致しますが、[ac]は「a」、「。」、または「c」のみに一致します。

この例では、

$ printf "colour\ncolor\ncolouur\n" | egrep 'colo.r'                           
colour
$ printf "colour\ncolor\ncolouur\n" | egrep 'colou.r'                          
colouur

適切に、最後のものは match any line that has "colou", plus any character, plus letter "r"

結論

あなたは尋ねました:「「*」はすべてまたは何も意味しないことを知っていますが、それについて考える正しい方法であるかどうかはわかりません。他の「。」& '?' 同じようだ。」ご覧のとおり、ドットとアスタリスクはまったく同じではありません。ドットはその特定の位置を占める可能性のあるすべての文字に作用し、疑問符は前の要素に作用します。


32

正規表現シェルグロブを混同している可能性があります

正規表現では、構文.は任意の1文字(通常は改行文字を除く)を表しますが、一方、先行する正規表現アトム(文字またはグループ)の0個以上を意味*する数量詞です。?は、先行するアトムのゼロまたは1つのインスタンスを意味する数量詞、または(それをサポートする正規表現の変形では)数量詞の動作を貪欲でないに設定する修飾子です。

シェルグロブで?は、単一の文字(regexのような.)を*表しますが、0個以上の文字のシーケンス(regexと同等)を表し.*ます。

役立つと思われるリファレンスは、http://www.regular-expressions.info/quickstart.htmlおよびhttp://mywiki.wooledge.org/globです。


6

注:Examples provided are in Python.概念は変わりませんが。

'.'は、改行文字以外の任意の文字に一致する一致記号です(これもre.DOTALLPythonの引数でオーバーライドできます)。したがって、ワイルドカードとも呼ばれます。

'*'ある数量詞(要素が起こり得る頻度を定義)が。{0、}の略です。

これは、「ゼロ以上の一致」を意味します。星の前にあるグループは、テキスト内で何回でも出現できます。完全に存在しないか、何度も繰り返される可能性があります。

'?'また、量指定子です。{0,1}の略です。

「ゼロまたはこの疑問符の前のグループの1つに一致」を意味します。疑問符の前の部分はオプションであるため、解釈することもできます

例えば:

pattern = re.compile(r'(\d{2}-)?\d{10}')
mobile1 = pattern.search('My number is 91-9999988888')
mobile1.group()
Output: '91-9999988888'

mobile2 = pattern.search('My number is 9999988888')
mobile2.group()
Output: '9999988888'

上記の例では「?」は、その前の2桁がオプションであることを示します。

との差 '。' および「?」:

'.'正規表現で保持している場所の任意の単一文字に一致/受け入れ/検証します

例えば:

pattern = re.compile(r'.ot')
pattern.findall('dot will identify both hot and got.')
Output: ['dot', 'hot', 'got']

'?'先行するグループのゼロまたは単一オカレンスに一致/検証します。

携帯電話番号の例を確認してください。

同じことが当てはまります'*'先行するグループのゼロ以上の発生をチェックします

組み合わせ:

'.*':可能な限り多くのシーケンスを受け入れます。貪欲なアプローチ

'.*?'最初に一致したシーケンスを受け入れて停止します。非欲張りなアプローチ

詳細については、次の2つの質問をお読みください...

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