Jak uzyskać cyfry przed określonym słowem, używając wyrażenia regularnego w c #?

10

Użyjemy poniżej wyrażenia regularnego, aby uzyskać cyfry przed słowami.

Przykład:

838123 someWord 8 someWord 12 someWord

(\d+)\s*someWord

Ale czasami wszystko będzie występować między liczbą a słowem. Zobacz poniższy przykładowy wiersz.

Dawny:

43434 z nieco 12 coś z czego 2323 nowy jakoś

Jak uzyskać dokładną cyfrę przed tym słowem za pomocą wyrażenia regularnego?

Proszę o sugestie.

Bala K.
źródło
3
Wygląda na to, że istniejące posty odpowiadają na twoje pytanie. Poinformuj osoby udzielające odpowiedzi i przyszłych czytelników, jeśli uznasz, że odpowiedzi są przydatne (obejrzyj prezentację ). W przeciwnym razie podaj więcej szczegółów na temat tego, czego szukasz i dlaczego odpowiedzi nie pasują do Twojego przypadku.
Reza Aghaei,
1
Nie jest jasne, o co pytasz ...
JohnyL

Odpowiedzi:

14

Zrób to:

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

Musisz zaakceptować wszystko inne niż same cyfry. Rozważyłem także oba, wa Wponieważ twoje przykłady zawierały oba.

Próbny

CinCout
źródło
Szukasz innej odpowiedzi?
Reza Aghaei,
@RezaAghaei może
CinCout,
Jakie są problemy z obecną odpowiedzią, którą udzieliłeś? Jakich ulepszeń szukasz?
Reza Aghaei,
@RezaAghaei Fakt, że OP nie przyjął jeszcze żadnej odpowiedzi, sprawia, że ​​zastanawiam się, czy przegapiłem sprawę narożną lub coś takiego. Mile widziane są również alternatywne podejścia do rozwiązania tego problemu.
CinCout,
1
@ CinCout-ReinstateMonica Proszę zobaczyć moją odpowiedź dotyczącą ewentualnego przypadku pominiętej krawędzi (nie jestem pewien, czy dotyczy to PO).
Steve Chambers,
4

Zakładając, że „cokolwiek” nie zawiera cyfr, możesz użyć tego wyrażenia regularnego:

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

Demo na regex101

Nacięcie
źródło
3

Jednym z możliwych „przypadków nieudanego narożnika” z odpowiedzi CinCout jest to, czy mecz someWordmusi być dokładny, np. Czy notsomeWordi someWordNotThisnie powinien być dopasowany.

Następujące rozszerzenie tego wyrażenia regularnego umożliwia rozwiązanie tego problemu:

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

Objaśnienie:[^\w] przed lub po dopasowującego dla someWordwygląd dla „charakter non-słowo” przed i po nim - koniec linii liczy również tutaj. Można to oczywiście uczynić bardziej złożonym / specyficznym, w zależności od dokładnych wymagań.

Próbny

Steve Chambers
źródło
3

Możesz spróbować czegoś takiego:

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

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

Możesz zobaczyć test tutaj

Jorge Filho
źródło
3

Pierwszy rozdzielono some[wW]ord, numberi spaceze wzorem, a następnie uruchomić drugi wzór na jego

 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();

Po wykonaniu pierwszego wzoru zdanie będzie zgodne z oczekiwaniami

43434 z nieco 12 coś z czego 2323 nowy jakoś

zmiana:

43434, nieco 12, a może 2323

Reza Jenabi
źródło
2

Ale czasami wszystko będzie występować między liczbą a słowem. Zobacz poniższy przykładowy wiersz.

Dawny:

43434 z nieco 12 coś z czego 2323 nowy jakoś

Spróbuj tego

(\ d +) (. *?) nieco

Wyjaśnione

\ d + - liczby

. *? - cokolwiek po liczbach, ale minimalne wystąpienie.

do pewnego stopnia - dokładne dopasowanie

Próbny

Rajesh G.
źródło
2

Użycie \s*spowoduje dopasowanie tylko 0 lub więcej białych znaków.

Możesz użyć, \D+ale będzie również pasować do nowego wiersza, ponieważ pasuje do dowolnego znaku oprócz cyfry.

Jeśli chcesz dopasować cyfry w tym samym wierszu, możesz dodać niezgodne znaki nowej linii do zanegowanej klasy znaków [^\d\r\n]

W twoim przykładzie używasz \d, ale jeśli chcesz dopasować tylko 1 lub więcej cyfr 0–9, możesz użyć klasy postaci[0-9]+

Aby cyfry i słowo nie były częścią większego słowa, możesz skorzystać z jego granic \b

Jeśli chcesz dopasować słowo bez rozróżniania wielkości liter, możesz użyć RegexOptions.IgnoreCaselub wbudowanego modyfikatora(?i)

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

Zobacz prezentację wyrażenia regularnego .NET

Czwarty ptak
źródło
2

Użyj nazwanego dopasowania przechwytywania (aby uzyskać wykorzystanie danych mtch.Groups["Value"].Value... itd.), Aby wyodrębnić informacje w razie potrzeby.

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

Gdy powyższe zostanie uruchomione ( w IgnorePatternWhiteSpaceprzeciwnym razie usuń komentarze i dołącz do wzorca, aby go uruchomić, np. (?<Value>\d+)(?<Other>.+?)(?<Key>someword)Bez opcji wyrażeń regularnych ), pobiera dane dla każdej pary danych / kluczy i organizuje je w jednym dopasowaniu.

Wynik

Oto wynik (dla twojego drugiego przykładu), które są zawarte w poszczególnych meczach, a ich grupy i przechwyty zapewniają w każdym meczu:

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

Oto, co jest dopasowane wizualnie:

wprowadź opis zdjęcia tutaj

ΩmegaMan
źródło