2017-02-02 3 views
1

Ich habe den folgenden regulären Ausdruck von Regular expression to count number of commas in a string.Regulärer Ausdruck, um die Anzahl der Muster in einer Zeichenfolge zu zählen

/^([^,]*,){21}[^,]*$/ 

Ist die am besten bewertete Lösung (https://stackoverflow.com/a/863137/3787418) für 21 Komma entsprechen.

Wie kann ich diesen regulären Ausdruck ändern, um die 21-fache "Hallo Welt" anstelle eines einzelnen Zeichens zu finden?

+0

Ich empfehle eine normale Suche als Regex für den Job. –

Antwort

1

regex ist wirklich nicht das Werkzeug für das, aber hier geht:

^(?:(?:[^h]|h(?!ello world))*hello world){21}(?:[^h]|h(?!ello world))*$ 

Dies wird nur in Regex-Varianten arbeiten, die negative Vorschau unterstützen.

Es funktioniert auf die gleiche Weise wie die Regex, die Sie gefunden haben: In einer Gruppe, die 21 Mal wiederholt wird, passen wir "was ist nicht Hallo Welt" gefolgt von einem Vorkommen von "Hallo Welt". Die Schwierigkeit bei der Anpassung ist „was nicht‚Hallo Welt‘“, die ich wie folgt definiert sind:

  • jedes Zeichen, das nicht h ([^h])
  • oder h ist, wenn sie nicht befolgt wird anstelle von ello world (h(?!ello world))

natürlich kann jeder vernünftige Mensch würde wählen, eine einfache Textsuche auf der Zeichenfolge verwenden.

+0

Da Sie davon abraten, reguläre Ausdrücke für diesen Anwendungsfall zu verwenden, wie würden Sie alle Zeilen aus einer Datei entfernen, die 21 mal "Hallo Welt" enthalten? – knowname

+0

@knowname unter welcher Art von Umgebung? node.js? – Aaron

+1

Zum Beispiel in einer 'bash' Umgebung mit' GNU Tools': 'while read line; do [$ (echo $ zeile | grep -Eo "\ bhello world \ b" | wc -l) -eq 21] || Echo $ -Zeile; getan < source > Ziel ' – Aaron

Verwandte Themen