Поддержка Java для "(? <Name> pattern)" в шаблонах

Мне было интересно, имеет ли Java эквивалент сопоставления с образцом С# с именем. Например, в С# я могу сделать что-то вроде этого:

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;

Это просто похоже на чистый способ захвата групп. Может ли Java сделать что-то подобное или мне нужно захватить группы на основе позиции индекса?

String foo = matcher.group(0);

Ответ 1

Это поддерживается, начиная с Java 7. Ваш код С# можно перевести на что-то вроде этого:

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;

Вам нужно создать объект Matcher, который фактически не выполняет тест регулярного выражения, пока вы не вызовете find().

(я использовал find(), потому что он может найти соответствие в любом месте входной строки, например метод Regex.Match(). .matches() возвращает true только в том случае, если регулярное выражение соответствует всей входной строке.)

Ответ 2

Java v1.7 теперь поддерживает стандартные группы с именем Perl, такие как (?<name>...) и \k<name> в шаблонах.

У вас не может быть дублированных имен групп в одном шаблоне, что может раздражать в очень сложных случаях, когда вы создаете более крупные шаблоны из меньших частей из своего контроля. В нем также отсутствует относительная индексация.

Однако этого должно быть достаточно для таких простых вещей, как вы, кажется, пишете.

Ответ 3

Я считаю, что вам нужен импорт

org.apache.commons.lang3.StringUtils;

для этого

 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])$");
    }