2012-06-22 11 views
11

Mi chiedevo se Java avesse un equivalente al modello di corrispondenza denominato C#. Ad esempio, in C# che posso fare qualcosa di simile:Supporto Java per "(? <name> modello)" nei modelli

var pattern = @";(?<foo>\d{6});(?<bar>\d{6});"; 
var regex = new Regex(pattern , RegexOptions.None); 
var match = regex.Match(";123456;123456;"); 

var foo = match.Groups["foo"].Success ? match.Groups["foo"].Value : null; 
var bar = match.Groups["bar"].Success ? match.Groups["bar"].Value : null; 

Questo sembra proprio come un modo pulito per afferrare gruppi. Java può fare qualcosa di simile, o ho bisogno di afferrare gruppi in base alla posizione dell'indice?

String foo = matcher.group(0); 
+0

Una delle cose più fastidiose su java = \ – Falmarri

risposta

16

Questo è supportato a partire dal Java 7. Il tuo codice C# può essere tradotto in qualcosa di simile:

String pattern = ";(?<foo>\\d{6});(?<bar>\\d{6});"; 
Pattern regex = Pattern.compile(pattern); 
Matcher matcher = regex.matcher(";123456;123456;"); 
boolean success = matcher.find(); 

String foo = success ? matcher.group("foo") : null; 
String bar = success ? matcher.group("bar") : null; 

è necessario creare un oggetto Matcher che in realtà non eseguire il test regex fino alla chiamata find().

(ho usato find() perché può trovare una corrispondenza ovunque nella stringa di input, come il metodo Regex.Match(). Il metodo .matches() restituisce true solo se la regex l'intera stringa di input.)

+1

Grazie per la risposta veloce. Sfortunatamente, stiamo ancora usando Java 6. Forse creerò un enum: String foo = matcher.group (MyGroups.FOO); – aelstonjones

+1

Controlla il progetto [named-regexp] (http://code.google.com/p/named-regexp/). Il suo scopo specifico è quello di fornire un modo per gestire gruppi con nome pre-Java7. – matts

+1

Il fork aggiornato di ['named-regexp'] (http://tony19.github.io/named-regexp) è preferito. – user46874

-2

Credo che hai bisogno di importare

org.apache.commons.lang3.StringUtils;

per questo

private Boolean validateEmail(String email) 
    { 
     return email.matches("^[-!#$%&'*+/0-9=?A-Z^_a-z{|}~](\\.?[-!#$%&'*+/0-9=?A-Z^_a-z{|}~])*@[a-zA-Z](-?[a-zA-Z0-9])*(\\.[a-zA-Z](-?[a-zA-Z0-9])*)+$"); 
    } 

    private Boolean validateIP(String IP) 
    { 
     return IP.matches("^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"); 
    } 

    private Boolean validateHostname(String Hostname) 
    { 
     return Hostname.matches("^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\\-]*[A-Za-z0-9])$"); 
    } 
+0

potrebbe aver frainteso la domanda. rileggerlo e ora questo non sembra quello che vuoi. non so cosa intendi per "gruppi grab" –

+0

Fondamentalmente, voglio un modo pulito per afferrare un modello abbinato dall'array del gruppo senza usare i numeri indice ma un nome. – aelstonjones

2

Java v1.7 ora supporta i gruppi denominati standard Perl come (?<name>...) e \k<name> nei modelli.

Non è possibile avere nomi di gruppi duplicati nello stesso motivo, il che può essere fastidioso in casi molto complessi in cui si creano modelli più grandi con pezzi più piccoli fuori dal proprio controllo. Manca anche l'indicizzazione relativa.

Tuttavia, dovrebbe essere sufficiente per cose così semplici come sembra che stiate scrivendo.