我希望在给定的输入字符串中匹配多个模式,因此结果将是一个包含与我的任何预定义模式匹配的所有子字符串的列表:
String input = "Episode_NN 3_CD was_XX awesome_XX";
final Pattern ruleOne = Pattern.compile("(\\w*_NN\\s|\\w*_NNS\\s)+\\w*_CD");
final Pattern ruleTwo = Pattern.compile(ruleOne.pattern().concat(""));
Matcher matcher = ruleOne.matcher(input);
List<String> ent = new ArrayList<String>();
while (matcher.find()) {
ent.add(matcher.group());
}
所以我必须添加多个Matchers吗?这意味着要多次扫描文本,如下所示:
while (matcherOne.find() | matcherTwo.find() | ...) {
....
}
答案 0 :(得分:0)
是的,就这么简单。除了你最好使用CONDITIONAL OR语句。这从左到右进行评估,如果第一个条件为真,则永远不会评估其余条件。它由两个条形组成:||
while (matcherOne.find() || matcherTwo.find() || ...) {
....
}
答案 1 :(得分:0)
以下是一种如何在1种模式中使用多种替代方法的方法(使用交替运算符|
):
\w*_NNS?\b|\w*_CD\b
示例代码
String input = "Episode_NN 3_CD was_XX awesome_XX";
final Pattern ruleOne = Pattern.compile("\\w*_NNS?\\b|\\w*_CD\\b");
Matcher matcher = ruleOne.matcher(input);
List<String> ent = new ArrayList<String>();
while (matcher.find()) {
ent.add(matcher.group());
}
String[] arr = new String[ent.size()];
arr = ent.toArray(arr);
System.out.println(Arrays.toString(arr));
请参阅IDEONE demo
输出:[Episode_NN, 3_CD]