it-swarm.com.de

Unterschied zwischen '.' , '?' und '*' in regulären Ausdrücken?

Könnte ich ein Beispiel dafür bekommen, wie sich diese drei Elemente (heißen sie Metazeichen?) Unterscheiden?

Ich weiß, dass * alles oder nichts bedeutet, aber ich bin mir nicht sicher, ob es der richtige Weg ist, darüber nachzudenken. Andererseits scheinen . und ? dasselbe zu sein. Sie stimmen mit einem Charakter überein, oder?

21
posixKing

Entnommen direkt aus Wikipedia :

? Das Fragezeichen gibt null oder ein Vorkommen des vorhergehenden Elements an. Beispielsweise stimmt Farbe sowohl mit "Farbe" als auch mit "Farbe" überein.

* Das Sternchen zeigt null oder mehr Vorkommen des vorhergehenden Elements an. Beispielsweise stimmt ab * c mit "ac", "abc", "abbc", "abbbc" usw. überein.

Der große Unterschied besteht darin, dass Sternchen mit null oder mehr Vorkommen übereinstimmen, während Fragezeichen mit null oder einem Vorkommen übereinstimmen. Vergleichen Sie diese beiden Beispiele:

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

Da in colouur der Buchstabe u (das vorherige Element vor dem Qualifikationsmerkmal ?) mehrmals vorkam, stimmt er nicht mit ? überein, entspricht jedoch *

Ähnliches Beispiel:

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

Von der gleichen Wikipedia-Seite:

Stimmt mit jedem einzelnen Zeichen überein (viele Anwendungen schließen Zeilenumbrüche aus und genau die Zeichen, die als Zeilenumbrüche gelten, sind geschmacks-, zeichencodierungs- und plattformspezifisch, es kann jedoch davon ausgegangen werden, dass das Zeilenvorschubzeichen enthalten ist). In POSIX-Klammerausdrücken entspricht das Punktzeichen einem Literalpunkt. Beispielsweise stimmt a.c mit "abc" usw. überein, aber [a.c] stimmt nur mit "a", "." Oder "c" überein.

In unserem Beispiel

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

Passenderweise lautet der letzte als match any line that has "colou", plus any character, plus letter "r"

Fazit

Sie haben gefragt: "Ich weiß, dass '*' alles oder nichts bedeutet, aber ich bin mir nicht sicher, ob es der richtige Weg ist, darüber nachzudenken. Auf der anderen Seite". & '?' scheinen gleich. " Wie Sie sehen können, sind der Punkt und der Stern nicht genau gleich. Der Punkt wirkt auf jedes Zeichen, das diese bestimmte Position einnimmt, während das Fragezeichen auf das vorhergehende Element wirkt.

16

Möglicherweise verwechseln Sie reguläre Ausdrücke mit Shell-Globs

In der Syntax für reguläre Ausdrücke steht . für ein einzelnes Zeichen (normalerweise ohne das Zeilenvorschubzeichen), während * ein Quantifizierer ist, der Null bedeutet oder mehr der vorhergehenden Regex atom (Zeichen oder Gruppe). ? ist ein Quantifizierer, der null oder eins Instanzen des vorhergehenden Atoms oder (in Regex-Varianten, die dies unterstützen) ein Modifizierer , der das Quantifiziererverhalten auf nicht gierig setzt.

In Shell-Globs steht ? für ein einzelnes Zeichen (wie der . des Regex), während * für eine Folge von null oder mehr Zeichen steht (entspricht dem Regex .*).

Einige nützliche Referenzen sind http://www.regular-expressions.info/quickstart.html und http://mywiki.wooledge.org/glob

31
steeldriver

Hinweis: Examples provided are in Python. Das Konzept bleibt jedoch dasselbe.

'.' ist ein übereinstimmendes Symbol , das mit jedem Zeichen außer Zeilenumbruchzeichen übereinstimmt (dies kann auch mit dem Argument re.DOTALL in Python überschrieben werden). Daher wird es auch als Wildcard bezeichnet.

'*' ist ein Quantifizierer (definiert, wie oft ein Element auftreten kann). Ist die Abkürzung für {0,} .

Dies bedeutet, dass „mit null oder mehr übereinstimmen“ - die Gruppe vor dem Stern kann in beliebiger Anzahl auftreten mal im text. Es kann ganz fehlen oder immer wieder wiederholt werden.

'?' ist auch ein Quantifizierer . Ist die Abkürzung für {0,1} .

Es bedeutet "Entspricht null oder einer der Gruppen vor diesem Fragezeichen." Es kann auch sein interpretiert als ist der Teil vor dem Fragezeichen optional .

z.B.:

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'

Im obigen Beispiel '?' Gibt an, dass die beiden vorangestellten Ziffern optional sind. Sie dürfen nicht oder höchstens einmal vorkommen.

Unterschied zwischen '.' und '?':

'.' passt/akzeptiert/überprüft jedes einzelne Zeichen für die Stelle, die es im regulären Ausdruck enthält.

z.B.:

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

'?' stimmt mit dem Null- oder Einzelvorkommen der -Gruppe überein .

Überprüfen Sie das Beispiel für eine Mobiltelefonnummer.

Gleiches gilt für '*'. Es überprüft null oder mehr Vorkommen der Gruppe davor .

Kombination:

'.*': Akzeptiert so viele Sequenzen wie verfügbar. Gieriger Ansatz .

'.*? 'Akzeptiert die erste übereinstimmende Sequenz und stoppt. Nicht gieriger Ansatz

Weitere Informationen finden Sie in den folgenden zwei Fragen ...

5
Dhaval Simaria