0

我有一个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";

我的正则表达式和/或匹配器有什么问题?

4

2 回答 2

3

立刻,我注意到:

[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

于 2013-11-04T18:20:12.890 回答
1

您正在使用字符类 [...]

[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)

因此,由于字符类将仅匹配内部使用的所有字符中的一个字符,[...]因此它将接受|or aor lor s... 等等,而更正的版本将仅接受由 OR like alor分隔的一种情况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}";
于 2013-11-04T18:20:26.260 回答