Come ottenere le cifre prima di una determinata parola usando regex in c #?


10

Useremo sotto regex per ottenere le cifre prima delle parole.

Esempio :

838123 someWord 8 someWord 12 someWord

(\d+)\s*someWord

Ma a volte qualcosa viene tra Numero e parola. Vedi la riga di esempio qui sotto.

Ex:

43434 di qualche parola 12 qualcosa di parola 2323 nuova parola

Come ottenere la cifra esatta prima di quella parola usando regex?

Per favore, dammi i tuoi suggerimenti.


3
Sembra che i post esistenti rispondano alla tua domanda. Per favore, fai sapere ai rispondenti e ai futuri lettori se trovi utili le risposte (Fai un giro ). Altrimenti, ti preghiamo di fornire maggiori dettagli su ciò che stai cercando e perché le risposte non sono adatte al tuo caso.
Reza Aghaei,

1
Non è chiaro cosa stai chiedendo ...
JohnyL,

Risposte:


14

Fai questo:

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

Devi accettare qualsiasi cosa diversa dalle cifre stesse. Ho anche considerato entrambi we Wpoiché i tuoi esempi contenevano entrambi.

dimostrazione


Stai cercando una risposta diversa?
Reza Aghaei,

@RezaAghaei forse
CinCout il

Quali sono i problemi con l'attuale risposta che hai fornito? Quali miglioramenti stai cercando?
Reza Aghaei,

@RezaAghaei Il fatto che OP non abbia ancora accettato alcuna risposta mi fa pensare se ho perso un caso d'angolo o qualcosa del genere. Sono ben accetti anche approcci alternativi per risolverlo.
CinCout il

1
@ CinCout-ReinstateMonica Si prega di consultare la mia risposta per un possibile caso limite perso (non sono sicuro se questo è rilevante per l'OP).
Steve Chambers,

4

Supponendo che "qualsiasi cosa" non includa cifre, è possibile utilizzare questa regex:

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

Demo su regex101


3

Un possibile "caso d'angolo mancato" dalla risposta di CinCout è se la corrispondenza per someWorddeve essere esatta, ad esempio se notsomeWorde someWordNotThisnon deve essere abbinata.

La seguente estensione a quell'espressione regolare fornisce un modo per risolvere questo problema:

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

Spiegazione: La [^\w]prima o dopo il matcher per someWordcercare un "carattere non-parola" , prima e dopo di esso - un capo della linea conta anche qui. Ciò potrebbe ovviamente essere reso più complesso / specifico, a seconda dei requisiti esatti.

dimostrazione


3

Potresti provare qualcosa del genere:

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

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

Puoi vedere il test qui


3

prima separato il some[wW]ord, numbere spacecon un modello, quindi esegue il secondo modello su di esso

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

Quando viene eseguito il primo modello, la frase sarà come desiderato

43434 di qualche parola 12 qualcosa di parola 2323 nuova parola

modificare:

43434 someword 12 someword 2323 someword


2

Ma a volte qualcosa viene tra Numero e parola. Vedi la riga di esempio qui sotto.

Ex:

43434 di qualche parola 12 qualcosa di parola 2323 nuova parola

prova questo

(\ D +) (. *?) Someword

spiegato

\ d + - numeri

. *? - qualsiasi cosa dopo i numeri ma occorrenza minima.

someword - corrispondenza esatta di un po '

dimostrazione


2

L'uso \s*corrisponde solo a 0 o più caratteri di spazi bianchi.

È possibile utilizzare \D+ma corrisponderà anche a nuove righe in quanto corrisponde a qualsiasi carattere tranne una cifra.

Se si desidera abbinare le cifre sulla stessa riga, è possibile aggiungere non abbinando una nuova riga a una classe di caratteri negata [^\d\r\n]

Nel tuo esempio, usi \d, ma se vuoi solo abbinare 1 o più cifre 0-9 puoi usare una classe di caratteri[0-9]+

Per evitare che le cifre e la parola facciano parte di una parola più grande, è possibile utilizzare i limiti delle parole \b

Se si desidera abbinare la parola in modo insensibile al maiuscolo / minuscolo, è possibile utilizzare RegexOptions.IgnoreCaseun modificatore incorporato(?i)

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

Guarda una demo regex .NET


2

Usa acquisizioni con corrispondenza denominata (per ottenere i dati usa mtch.Groups["Value"].Value... ecc.) Per estrarre le informazioni secondo necessità.

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

Quando viene eseguito il sopra ( con IgnorePatternWhiteSpacealtrimenti rimuovere i commenti e partecipare alla motivo per farlo funzionare come (?<Value>\d+)(?<Other>.+?)(?<Key>someword)senza opzioni regex ) ottiene i dati per ogni dati / Le coppie di chiavi e organizza ciascuno in una singola partita.

Risultato

Ecco il risultato (per il tuo secondo esempio) che sono tutti contenuti nelle singole partite e i loro gruppi e acquisizioni forniscono in ogni partita:

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

Visivamente ecco cosa corrisponde:

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.