Wie bekomme ich die Ziffern vor einem bestimmten Wort mit Regex in c #?

10

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.

bala k
quelle
3
Es sieht so aus, als würden die vorhandenen Beiträge Ihre Frage beantworten. Bitte lassen Sie die Antwortenden und zukünftigen Leser wissen, ob Sie die Antworten nützlich finden (Machen Sie eine Tour ). Andernfalls geben Sie bitte näher an, wonach Sie suchen und warum die Antworten nicht zu Ihrem Fall passen.
Reza Aghaei
1
Nicht klar, was Sie fragen ...
JohnyL

Antworten:

14

Mach das:

(\d+)[^\d]+some[wW]ord

Sie müssen alles andere als Ziffern selbst akzeptieren. Auch ich habe beides in Betracht gezogen wund Wda Ihre Beispiele beides enthielten.

Demo

CinCout
quelle
Suchen Sie eine andere Antwort?
Reza Aghaei
@ RezaAghaei vielleicht
CinCout
Was sind die Probleme mit der aktuellen Antwort, die Sie gegeben haben? Welche Verbesserungen suchen Sie?
Reza Aghaei
@RezaAghaei Die Tatsache, dass OP noch keine Antwort akzeptiert hat, lässt mich darüber nachdenken, ob ich einen Eckfall oder etwas verpasst habe. Alternative Lösungsansätze sind ebenfalls willkommen.
CinCout
1
@ CinCout-ReinstateMonica In meiner Antwort finden Sie einen möglichen Fall mit fehlenden Kanten (nicht sicher, ob dies für das OP relevant ist).
Steve Chambers
4

Unter der Annahme, dass "irgendetwas" keine Ziffern enthält, können Sie diesen regulären Ausdruck verwenden:

(\d+)[^\d]+someWord

Demo auf regex101

Nick
quelle
3

Ein möglicher "Fall einer verpassten Ecke" aus CinCouts Antwort ist, ob die Übereinstimmung für someWordgenau sein muss, z. B. ob notsomeWordund someWordNotThisnicht ü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 die someWordSuche 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

Steve Chambers
quelle
3

Sie könnten so etwas versuchen:

(\d+)\s?([^\d]*)

(\d+)    - get the digits
\s?      - discard a possible space
([^\d]*) - get all chars that are not digits

Sie können den Test hier sehen

Jorge Filho
quelle
3

erster abgetrennt some[wW]ord, numberund spacemit einem Muster, dann das zweite Muster auszuführen drauf

 var pattern = @"\b(some[wW]ord|[\d]|\s)*\b";
 var rgx = new Regex(pattern);
 var sentence = "43434 of someword 12 anything someword 2323 new someword";
 var result = string.Empty;
 foreach (Match match in rgx.Matches(sentence)){
     result += match.Value;
}
//output => result: 43434 someword 12 someword 2323 someword

 var patternOnCorrectSentence = @"\b(\d+)\s*some[wW]ord*\b";
 var rgxOnCorrectSentence = new Regex(patternOnCorrectSentence);

 var resultOnCorrectSentence = new List<string>();
 foreach (Match match in rgxOnCorrectSentence.Matches(result)){
     resultOnCorrectSentence.Add(match.Value);
 }
 resultOnCorrectSentence.ForEach(Console.WriteLine);

 Console.ReadKey();

Wenn das erste Muster ausgeführt wird, ist der Satz wie gewünscht

43434 von irgendwo 12 irgendetwas irgendwo 2323 neu irgendwo

Veränderung:

43434 irgendwo 12 irgendwo 2323 irgendwo

Reza Jenabi
quelle
2

Aber manchmal kommt etwas zwischen Zahl und Wort. Bitte sehen Sie die folgende Beispielzeile.

Ex:

43434 von irgendwo 12 irgendetwas irgendwo 2323 neu irgendwo

Versuche dies

(\ d +) (. *?) irgendwo

Erklärt

\ d + - Zahlen

. *? - alles nach Zahlen außer minimalem Vorkommen.

irgendwo - genaue Übereinstimmung von etwas

Demo

Rajesh G.
quelle
2

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.IgnoreCaseeinen Inline-Modifikator verwenden(?i)

(?i)\b([0-9]+)\b[^\d\r\n]*\bsomeword\b

Sehen Sie sich eine .NET- Regex-Demo an

Der vierte Vogel
quelle
2

Verwenden Sie Named Match Captures (um Daten zu erhalten mtch.Groups["Value"].Value... usw.), um die Informationen nach Bedarf zu extrahieren.

(?<Value>\d+)     -- Get the digits
(?<Other>.+?)     -- Capture all text, but minimal (greedy) capture
(?<Key>someword)  -- til the keyword here.

Wenn die oben ausgeführt wird ( mit IgnorePatternWhiteSpaceansonsten 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:

Match #0
              [0]:  43434˽of˽someword
  ["Value"]  [1]:  43434
      1 Captures:  43434
  ["Other"]  [2]:  ˽of˽
      2 Captures:  ˽of˽
    ["Key"]  [3]:  someword
      3 Captures:  someword
Match #1
              [0]:  12˽anything˽someword
  ["Value"]  [1]:  12
      1 Captures:  12
  ["Other"]  [2]:  ˽anything˽
      2 Captures:  ˽anything˽
    ["Key"]  [3]:  someword
      3 Captures:  someword
Match #2
              [0]:  2323˽new˽someword
  ["Value"]  [1]:  2323
      1 Captures:  2323
  ["Other"]  [2]:  ˽new˽
      2 Captures:  ˽new˽
    ["Key"]  [3]:  someword
  3 Captures:  someword

Optisch stimmt hier Folgendes überein:

Geben Sie hier die Bildbeschreibung ein

ΩmegaMan
quelle