2012-05-31 30 views
7

Ho una stringa con due o più numeri. Ecco alcuni esempi:Utilizzo di espressioni regolari per estrarre più numeri dalle stringhe

"(1920x1080)" 
" 1920 by 1080" 
"16 : 9" 

Come posso estrarre separati numeri come "1920" e "1080" da essa, ammesso che sarà solo essere separati da uno o più non numerico caratteri (s)?

+0

Per favore, decidi in quale lingua è necessario inserire la risposta. Gli oggetti regex in .NET non sono gli stessi di Java. – Oded

+0

@Oded ok, fatto. – David

risposta

9

L'espressione regolare di base sarebbe:

[0-9]+ 

Sarà necessario utilizzare la libreria di andare oltre tutte le partite e ottenere i loro valori.

var matches = Regex.Matches(myString, "[0-9]+"); 

foreach(var march in matches) 
{ 
    // match.Value will contain one of the matches 
} 
1
(\d+)\D+(\d+) 

Dopodiché, personalizza questa espressione regolare in modo che corrisponda al sapore della lingua che utilizzerai.

+0

'\ d' conterrà _all_ cifre, non solo numeri romani, a seconda della libreria regex e della piattaforma. – Oded

+0

.net/C# (e PCRE) regex '\ d' corrisponde a [0-9]. Periodo. – dda

+0

No, non è così. Corrisponde a- http://stackoverflow.com/a/6479605/1583 – Oded

1

è possibile utilizzare

string[] input = {"(1920x1080)"," 1920 by 1080","16 : 9"}; 
foreach (var item in input) 
{ 
    var numbers = Regex.Split(item, @"\D+").Where(s => s != String.Empty).ToArray(); 
    Console.WriteLine("{0},{1}", numbers[0], numbers[1]); 
} 

USCITA:

1920,1080 
1920,1080 
16,9 
+0

buono, ma spesso restituisce stringhe extra vuote. – David

+0

Sì, aggiornato, grazie @David – Damith

5

È possibile ottenere la stringa seguendo

MatchCollection v = Regex.Matches(input, "[0-9]+"); 
foreach (Match s in v) 
      { 
       // output is s.Value 
      } 
+0

'RegexOptions.IgnoreCase' non è necessario. I numeri romani non hanno maiuscole/minuscole. – Oded

+0

Normalmente mi alleno con RegexOptions.IgnoreCase. Ci scusiamo per l'errore –

+0

Non è un errore in quanto tale. Semplicemente non necessario in questo caso. – Oded

0

C'è ancora un problema, però, tutte le risposte di cui sopra considerare i numeri validi 12i o a2 quando hanno sh ouldn't.

Quanto segue potrebbe risolvere questo problema

var matches = Regex.Matches(input, @"(?:^|\s)\d+(?:\s|$)"); 

Ma questa soluzione aggiunge una questione più :) Questo catturerà gli spazi intorno al numero intero. Per risolvere questo problema dobbiamo acquisire il valore dell'intero in un gruppo:

MatchCollection matches = Regex.Matches(_originalText, @"(?:^|\s)(\d+)(?:\s|$)"); 
HashSet<string> uniqueNumbers = new HashSet<string>(); 
foreach (Match m in matches) 
{ 
    uniqueNumbers.Add(m.Groups[1].Value); 
} 
Problemi correlati