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}";