Поддержка 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])$");
}