2009-10-17 10 views
8

Sto convertendo il codice Java in C# e devo sostituire l'uso della regex di Java. Un uso tipico èQual è l'equivalente C# di java.util.regex?

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
//... 

String myString = "B12"; 
Pattern pattern = Pattern.compile("[A-Za-z](\\d+)"); 
Matcher matcher = Pattern.matcher(myString); 
String serial = (matcher.matches()) ? matcher.group(1) : null; 

che dovrebbe estrarre un gruppo di acquisizione da una stringa di destinazione corrispondente. Sarei grato per semplici esempi.


EDIT: Ora ho aggiunto il C# equivalente del codice come una risposta.

MODIFICA: Here is a tutorial sull'utilizzo delle espressioni effettive.

EDIT: (. E Perl) Here is a useful comparison di C# e Java

+0

@Mehrdad grazie. Questo è esattamente quello che volevo anche se la domanda ha avuto un downvote da qualche parte (forse un duplicato, anche se ho provato a cercare SO) –

+0

Non so. Non ero io. I duplicati di solito non ottengono downvotes. Si chiudono –

+2

@ Jason: E il tuo punto è? Che le persone non dovrebbero essere in grado di trovare le risposte di cui hanno bisogno su StackOverflow? Che dovrebbero tentare la fortuna su Google, dove potrebbero trovare le risposte sbagliate? SO è stato * fatto * per essere il posto giusto per trovare le risposte alle domande di programmazione. Google non era. – jalf

risposta

5

ho creato il C# equivalente del codice Java nella questione come:

string myString = "B12"; 
Regex rx = new Regex(@"[A-Za-z](\\d+)"); 
MatchCollection matches = rx.Matches(myString); 
if (matches.Count > 0) 
{ 
    Match match = matches[0]; // only one match in this case 
    GroupCollection groupCollection = match.Groups; 
    Console.WriteLine("serial " + groupCollection[1].ToString()); 
} 

EDIT (vedere @ utili commenti di Mehrdad)

Il codice originale era:

// ... 

MatchCollection matches = rx.Matches(myString); 
foreach (Match match in matches) 
{ 
    GroupCollection groupCollection = match.Groups; 
    Console.WriteLine("serial " + groupCollection[1].ToString()); 
} 
+0

Devi assicurarti che ci sia effettivamente una corrispondenza prima di provare ad accedere a 'partite [0]'. Altrimenti, otterrai un 'IndexOutOfRangeException'. –

+0

@Mehrdad grazie. L'ho avuto in un ciclo di foreach che era sicuro e poi ho cercato di semplificarlo. Ho modificato –

+0

Sì, se lo stai usando in un 'foreach', è meglio ** non fare riferimento a' Count' ** in anticipo perché causerà la valutazione immediata del 'Regex' (al contrario della valutazione lazy si ottiene con 'foreach') –