Eine Einführung in reguläre Ausdrücke

Einführung

Als Systemadministratoren, Entwickler, QA-Ingenieure, Support-Ingenieure usw. muss man ein bestimmtes Muster finden, wie eine Reihe von IP-Adressen, die zu einem bestimmten Bereich gehören, oder einen Bereich von Zeitstempeln oder Gruppen von Domänen- oder Subdomänennamen, aus Dateien. Man muss möglicherweise auch ein Wort in einer bestimmten Weise buchstabiert finden oder mögliche Tippfehler in einer Datei finden. Hier kommen reguläre Ausdrücke ins Spiel.

Reguläre Ausdrücke sind Vorlagen zum Abgleichen von Mustern (oder manchmal zum Nichtabgleichen von Mustern). Sie bieten eine Möglichkeit, Text zu beschreiben und zu analysieren. Dieses Tutorial gibt einen Einblick in reguläre Ausdrücke, ohne auf Einzelheiten einer bestimmten Sprache einzugehen. Wir verwenden einfach egrep, um die Konzepte zu erläutern.

Reguläre Ausdrücke

Reguläre Ausdrücke bestehen aus zwei Arten von Zeichen:

  • den regulären Literalzeichen und

  • den Metazeichen

sind diejenigen, die den regulären Ausdrücken ihre Kraft verleihen.

Betrachten Sie die folgende country.txt-Datei, in der die erste Spalte der Ländername, die zweite Spalte die Bevölkerung des Landes und die dritte Spalte der Kontinent ist.

$ cat country.txt
India,1014003817,Asia
Italy,57634327,Europe
Yemen,1184300,Asia
Argentina,36955182,Latin America
Brazil,172860370,Latin America
Cameroon,15421937,Africa
Japan,126549976,Asia

Verankerungsmetazeichen

Die erste Gruppe von „Metazeichen“, über die wir sprechen werden, sind ^ und $. ^ und $ entsprechen dem Beginn und Ende eines Musters und werden als Verankerungsmetazeichen bezeichnet.

Um die Namen aller Länder zu finden, deren Name mit I beginnt, verwenden wir den Ausdruck:

$ egrep '^I' country.txt
India,1014003817,Asia
Italy,57634327,Europe

oder um alle Länder zu finden, deren Kontinentnamen mit e enden, tun wir Folgendes:

$ egrep 'e$' country.txt
Italy,57634327,Europe

Das nächste Metazeichen ist der Punkt (.), der zu einem einzelnen Zeichen passt. Um alle Zeilen abzugleichen, in denen der Ländername genau 5 Zeichen lang ist:

$ egrep '^.....,' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Yemen,1184300,Asia
Japan,126549976,Asia

Wie wäre es, alle Zeilen zu finden, in denen der Ländername mit I oder J beginnt und der Ländername 5 Zeichen lang ist?

$ egrep '^[IJ]....,' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Japan,126549976,Asia

[…] wird als Zeichenmenge oder Zeichenklasse bezeichnet. Innerhalb einer Zeichenmenge wird nur eines der angegebenen Zeichen abgeglichen.

Ein ^ innerhalb der Zeichenmenge negiert die Zeichenmenge. Das folgende Beispiel wird Ländernamen abgleichen, die fünf Zeichen lang sind, aber nicht mit I oder J beginnen.

$ egrep '^[^IJ]....,' country.txt
Yemen,1184300,Asia

Das Gruppierungszeichen und die Alternative

Um alle Zeilen zu finden, die Asia oder Afrika enthalten:

$ egrep 'Asia|Africa' country.txt
India,1014003817,Asia
Yemen,1184300,Asia
Cameroon,15421937,Africa
Japan,126549976,Asia

Dies kann auch erreicht werden, indem man A und a gemeinsam nimmt.

$ egrep 'A(si|fric)a' country.txt
India,1014003817,Asia
Yemen,1184300,Asia
Cameroon,15421937,Africa
Japan,126549976,Asia

Quantifizierer

Anstelle von

$ egrep '^[IJ]....,' country.txt

schreiben wir

$ egrep '^[IJ].{4},' country.txt

, wobei {} als die Quantifizierer bezeichnet werden. Sie bestimmen, wie oft das vorangehende Zeichen auftreten sollte.

Wir können auch einen Bereich angeben:

$ egrep '^[IJ].{4,6},' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Japan,126549976,Asia

Dies wird zu Ländernamen passen, die mit I oder J beginnen und 4 bis 6 Zeichen danach haben.

Es gibt einige Abkürzungen für die Quantifizierer. Zum Beispiel ist

{0,1} äquivalent zu ?

$ egrep '^ab{0,1}c$' filename

das gleiche wie

$ egrep '^ab?c' filename

{0,} ist äquivalent zu *

$ egrep '^ab{0,}c$' filename

das gleiche wie

$ egrep '^ab*c' filename

{1,} ist äquivalent zu +

$ egrep '^ab{1,}c$' filename

das gleiche wie

$ egrep '^ab+c' filename

Lassen Sie uns einige Beispiele mit den bisher gesehenen Ausdrücken sehen. Hier suchen wir nicht in einer Datei, sondern in der Standardeingabe. Der Trick, den wir anwenden, besteht darin, dass wir wissen, dass grep (oder egrep) nach einem Muster sucht, und wenn ein Muster gefunden wird, dann wird die gesamte Zeile, die das Muster enthält, angezeigt.

Wir möchten alle möglichen Schreibweisen des Satzes der graue Anzug war sein Favorit herausfinden.

Der Ausdruck wäre:

$ egrep 'the gr[ea]y colou?r suit was his favou?rite'
the grey color suit was his favourite
the grey color suit was his favourite

the gray colour suit was his favorite
the gray colour suit was his favorite

Beim Betrachten des obigen Ausdrucks sehen wir, dass:

  • grau kann als grau oder gray geschrieben werden

  • Farbe kann als Farbe oder color geschrieben werden, das bedeutet, dass u optional ist, also verwenden wir u?

  • ebenso kann favorite oder favourite als favou?rite geschrieben werden

Wie wäre es mit der Übereinstimmung einer US-Postleitzahl?

$ egrep '^[0-9]{5}(-[0-9]{4})?$'
83456
83456

83456-

834562

92456-1234
92456-1234

10344-2342-345

Ein weiteres Beispiel zur Übereinstimmung aller gültigen Zeiten in einer 24-Stunden-Uhr.

$ egrep '^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]'
23:44:02
23:44:02

33:45:11

15:45:33
15:45:33

In obigem Beispiel haben wir gesagt, dass, wenn die erste Ziffer der Stunde entweder 0 oder 1 ist, dann die zweite jede von 0 bis 9 sein wird. Aber wenn die erste Ziffer 2 ist, dann sind die erlaubten Werte für die zweite Ziffer 0, 1, 2 oder 3.

Wortgrenze

Um ein Muster zu schreiben, das Wörter am Ende mit Farbe wie unicolor, watercolor, multicolor usw. übereinstimmt, aber nicht farblos oder bunt. Versuchen Sie diese Beispiele selbst, um sich damit vertraut zu machen:

$ egrep 'color\>'

Anschließend, um farblos und bunt, aber nicht unicolor, watercolor, multicolor usw. abzustimmen.

$ egrep '\<color'

Um das genaue Wort Farbe abzustimmen, tun wir:

$ egrep '\<color\>'

Rückverweise

Angenommen, wir möchten alle Wörter finden, die doppelt eingegeben wurden, wie das das oder vorher vorher, müssen wir Rückverweise verwenden. Rückverweise werden verwendet, um Muster zu merken.

Hier ist ein Beispiel:

$ egrep "\<the\> \1"

Oder auf generische Weise:

$ egrep "\<(.*)\> \1"

Das obige Beispiel kann verwendet werden, um alle Namen zu finden, bei denen die Vor- und Nachnamen identisch sind. Falls es mehr als einen Satz von Klammern gibt, können diese mit \2, \3, \4 usw. referenziert werden.

Dies ist nur eine Einführung in die Kraft regulärer Ausdrücke.

Source:
https://www.digitalocean.com/community/tutorials/an-introduction-to-regular-expressions