2012-06-22 13 views
11

Zastanawiam się, czy Java miał odpowiednik nazwanego dopasowania wzorca C#. Na przykład w języku C# mogę zrobić coś takiego:Obsługa języka Java dla "(? <name> wzorzec)" w wzorach

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; 

To wydaje się być czystym sposobem na zgarnięcie grup. Czy Java może zrobić coś podobnego, czy też muszę pobierać grupy na podstawie pozycji indeksu?

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

Jedna z najbardziej denerwujących rzeczy w java = \ – Falmarri

Odpowiedz

16

To jest obsługiwany począwszy Java 7. Twój kod C# można przełożyć na coś takiego:

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; 

Trzeba stworzyć Matcher przedmiot, który nie właściwie przeprowadzić test regex aż zadzwonisz find().

(użyłem find() ponieważ może znaleźć dopasowanie w dowolnym miejscu w ciągu wejściowego, jak metoda Regex.Match(). Metoda .matches() zwraca tylko prawdziwe jeśli wyrażenie regularne dopasowuje cały ciąg wejściowy).

v1.7
+1

Dzięki za szybką odpowiedź. Niestety wciąż używamy języka Java 6. Może po prostu utworzę enum: String foo = matcher.group (MyGroups.FOO); – aelstonjones

+1

Zobacz projekt [named-regexp] (http://code.google.com/p/named-regexp/). Jego szczególnym celem jest zapewnienie sposobu obsługi nazwanych grup przed wersją Java7. – matts

+1

Preferowane jest zaktualizowane widmo ['named-regexp'] (http://tony19.github.io/named-regexp). – user46874

-2

wierzę trzeba importować

org.apache.commons.lang3.StringUtils;

tego

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

mogła źle zrozumieć pytanie. przeczytaj go ponownie, a teraz to nie wygląda tak, jak chcesz. Nie wiem, co masz na myśli przez "zgarnij grupy". –

+0

Zasadniczo, chcę czysty sposób, aby pobrać dopasowany wzorzec z tablicy grupy bez używania numerów indeksu, ale zamiast tego nazwy. – aelstonjones

2

Java teraz obsługuje standardowe nazwy Perla, takie jak (?<name>...) i \k<name> we wzorach.

Nie można mieć zduplikowanych nazw grup w tym samym wzorze, co może być denerwujące w bardzo złożonych przypadkach, gdy budujesz większe wzory z mniejszych elementów poza kontrolą. Brakuje również indeksowania względnego.

Jednak powinno to wystarczyć na takie proste czynności, jak się wydaje, że piszesz.

Powiązane problemy