>我有一个String
String s = "adfgadfbfgadg sa 2419sfgh";
我正在尝试提取子字符串
String substring = "sa 2419sfgh";
使用以下正则表达式和代码的模式和匹配器。
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";
我的正则表达式和/或匹配器有什么问题?
我立即注意到:
[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
......依此类推,而更正后的版本将只接受由 OR 分隔的情况之一,如 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}";