2010-11-15 17 views
10

Qualcuno può aiutarmi a costruire questo espressione regolare si prega di ...espressioni regolari per estrarre i numeri da una stringa

Date le seguenti stringhe ...

  • "Aprile (123 widgets meno 456 pignoni)"
  • "può (789 widgets meno 012 pignoni)"

ho bisogno di un'espressione regolare che estrae i due numeri dal testo. Il nome del mese varierà. Le parentesi, il testo "widgets less" e "pignoni" non dovrebbero cambiare tra le stringhe, tuttavia sarebbe davvero utile se anche questo testo potesse essere modificato.

Grazie in anticipo.

risposta

27

se si sa per certo che non ci sono solo andando a essere di 2 posti in cui si dispone di un elenco di cifre nella stringa e che è l'unica cosa che si sta per tirare poi fuori si dovrebbe essere in grado di utilizzare semplicemente

\d+ 
+0

Mi hai battuto! La regex di cui sopra, se applicata globalmente all'intera stringa (che dipende dall'implementazione, quindi l'OP dovrebbe indurci a entrare nella lingua), estrarrà i numeri e ignorerà il resto. –

+1

Ad esempio, in ruby ​​sarebbe 'matches = string.scan (/ \ d + /)' –

+0

Le mie scuse, sto usando l'implementazione .NET. –

23
^\s*(\w+)\s*\(\s*(\d+)\D+(\d+)\D+\)\s*$ 

dovrebbe funzionare. Dopo la partita, backreference 1 conterrà il mese, backreference 2 conterrà il primo numero e backreference 3 il secondo numero.

Spiegazione:

^  # start of string 
\s* # optional whitespace 
(\w+) # one or more alphanumeric characters, capture the match 
\s* # optional whitespace 
\( # a (
\s* # optional whitespace 
(\d+) # a number, capture the match 
\D+ # one or more non-digits 
(\d+) # a number, capture the match 
\D+ # one or more non-digits 
\) # a) 
\s* # optional whitespace 
$  # end of string 
+2

+1 per la spiegazione, ma devo dare la risposta corretta a Seattle Leonard in quanto è così semplice. –

+0

Buona spiegazione della tua soluzione – itsmatt

2

si potrebbe usare qualcosa come:

[^0-9]+([0-9]+)[^0-9]+([0-9]+).+

Quindi ottenere il primo e il secondo gruppo di cattura.

Problemi correlati