Wir werden den folgenden regulären Ausdruck verwenden, um die Ziffern vor den Wörtern zu erhalten.
Beispiel:
838123 someWord 8 someWord 12 someWord
(\d+)\s*someWord
Aber manchmal kommt etwas zwischen Zahl und Wort. Bitte sehen Sie die folgende Beispielzeile.
Ex:
43434 von irgendwo 12 irgendetwas irgendwo 2323 neu irgendwo
Wie kann man mit Regex die genaue Ziffer vor diesem Wort ermitteln?
Bitte geben Sie mir Ihre Vorschläge.
Antworten:
Mach das:
(\d+)[^\d]+some[wW]ord
Sie müssen alles andere als Ziffern selbst akzeptieren. Auch ich habe beides in Betracht gezogen
w
undW
da Ihre Beispiele beides enthielten.Demo
quelle
Unter der Annahme, dass "irgendetwas" keine Ziffern enthält, können Sie diesen regulären Ausdruck verwenden:
Demo auf regex101
quelle
Ein möglicher "Fall einer verpassten Ecke" aus CinCouts Antwort ist, ob die Übereinstimmung für
someWord
genau sein muss, z. B. obnotsomeWord
undsomeWordNotThis
nicht übereinstimmen sollte.Die folgende Erweiterung dieses regulären Ausdrucks bietet eine Möglichkeit, dies zu beheben:
(\d+)[^\d]*[^\w]some[wW]ord[^\w]
Erläuterung: Das
[^\w]
Vorher oder Nachher des Matchers für diesomeWord
Suche nach einem "Nicht-Wort-Zeichen" davor und danach - auch hier zählt ein Zeilenende. Dies könnte natürlich je nach den genauen Anforderungen komplexer / spezifischer gestaltet werden.Demo
quelle
Sie könnten so etwas versuchen:
Sie können den Test hier sehen
quelle
erster abgetrennt
some[wW]ord
,number
undspace
mit einem Muster, dann das zweite Muster auszuführen draufWenn das erste Muster ausgeführt wird, ist der Satz wie gewünscht
Veränderung:
quelle
Aber manchmal kommt etwas zwischen Zahl und Wort. Bitte sehen Sie die folgende Beispielzeile.
Ex:
Versuche dies
Erklärt
Demo
quelle
Die Verwendung entspricht
\s*
nur 0 oder mehr Leerzeichen.Sie können verwenden,
\D+
aber es stimmt auch mit Zeilenumbrüchen überein, da es mit jedem Zeichen außer einer Ziffer übereinstimmt.Wenn Sie die Ziffern in derselben Zeile abgleichen möchten, können Sie einer negierten Zeichenklasse eine nicht übereinstimmende neue Zeile hinzufügen
[^\d\r\n]
In Ihrem Beispiel verwenden Sie
\d
, aber wenn Sie nur mit einer oder mehreren Ziffern 0-9 übereinstimmen möchten, können Sie eine Zeichenklasse verwenden[0-9]+
Um zu verhindern, dass die Ziffern und das Wort Teil eines größeren Wortes sind, können Sie Wortgrenzen verwenden
\b
Wenn Sie das Wort ohne Berücksichtigung der Groß- und Kleinschreibung zuordnen möchten, können Sie
RegexOptions.IgnoreCase
einen Inline-Modifikator verwenden(?i)
Sehen Sie sich eine .NET- Regex-Demo an
quelle
Verwenden Sie Named Match Captures (um Daten zu erhalten
mtch.Groups["Value"].Value
... usw.), um die Informationen nach Bedarf zu extrahieren.Wenn die oben ausgeführt wird ( mit
IgnorePatternWhiteSpace
ansonsten die Kommentare zu entfernen und das Muster verbinden , um sie auszuführen, wie(?<Value>\d+)(?<Other>.+?)(?<Key>someword)
ohne regex Optionen ) er die Daten für jedes Datum / Schlüsselpaare erhält und organisiert jedes in einem Einzelspiel.Ergebnis
Hier ist das Ergebnis (für Ihr zweites Beispiel), das alle in einzelnen Spielen enthalten ist und dessen Gruppen und Erfassungen in jedem Spiel enthalten sind:
Optisch stimmt hier Folgendes überein:
quelle