Matcher.group и Regular Expressions Не извлекает полное регулярное выражение

У меня есть String

String s = "adfgadfbfgadg sa 2419sfgh";

Я пытаюсь извлечь подстроку

String substring = "sa 2419sfgh"; 

с Pattern и Matcher, используя следующее регулярное выражение и код.

formNumberRegex = "[al|sf|sa|sc|nrc|nrc form|doe|doe f|lsi|doe form psd f|doe al f]?[\\s\\-\\.]*[\\d]{3,6}[\\s\\-\\.]*[\\w]{1,4}";
formNumberRegexPattern = Pattern.compile(formNumberRegex);
formNumberMatcher = formNumberRegexPattern.matcher(s);

if (formNumberMatcher.find()) {
    String substring = formNumberMatcher.group();
}

Тем не менее, я только получаю

substring = "a 2419sfgh";

Что не так с моим регулярным выражением и / или Matcher?

2 ответа

Решение

Сразу замечаю:

[al|sf|sa|sc|nrc|nrc form|doe|doe f|lsi|doe form psd f|doe al f]?

должно быть:

(?:al|sf|sa|sc|nrc|nrc form|doe|doe f|lsi|doe form psd f|doe al f)?

"Группа без захвата" (?:) Позволяет избежать захвата этой первой части как исходной группы. Таким образом, все выражение "группа совпадений 0" и все.

Протестировано здесь: http://regex101.com/r/lS9dT2

Вы используете класс персонажа [...]

[al|sf|sa|sc|nrc|nrc form|doe|doe f|lsi|doe form psd f|doe al f]

вместо группы

(al|sf|sa|sc|nrc|nrc form|doe|doe f|lsi|doe form psd f|doe al f)

То, что вы использовали, может быть написано как

(\\||a|l|s|f|s|a|s|c|n|r|c|n|r|c| |f|o|r|m|d|o|e|d|o|e| |f|l|s|i|d|o|e| |f|o|r|m| |p|s|d| |f|||d|o|e| |a|l| |f)

так как класс символов будет соответствовать только один символ из всех используемых внутри [...] это примет | или же a или же l или же s... и так далее, в то время как исправленная версия будет принимать только один из случаев, разделенных ИЛИ, как al или же sf и так далее.

Так что измените свое регулярное выражение на

String formNumberRegex = "(al|sf|sa|sc|nrc|nrc form|doe|doe f|lsi|doe form psd f|doe al f)?[\\s\\-\\.]*[\\d]{3,6}[\\s\\-\\.]*[\\w]{1,4}";
Другие вопросы по тегам