java - 如何在不多次扫描的情况下将文本匹配多种模式?

标签 java regex pattern-matching

我想匹配给定输入字符串中的多个模式,因此结果将是一个包含与我的任何预定义模式匹配的所有子字符串的列表:

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());
}

那么我必须添加多个匹配器吗?这意味着多次扫描文本,如下所示:

while (matcherOne.find() | matcherTwo.find() | ...) {
   ....
}

最佳答案

这是一种如何在一个模式中使用多个替代方案的方法(使用交替运算符|):

\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]

关于java - 如何在不多次扫描的情况下将文本匹配多种模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30752993/

相关文章:

java - Apache Storm 工作线程异步循环终止

java - 字符串列表上的 @Pattern 注释

java - 在 Java 中使用正则表达式模式

linux - awk匹配前两列的值并在空白字段中打印

java - 更改 Spring PropertyPlaceholderConfigurer 以从另一个源读取

java - 带 Spring Boot 的充气城堡

Java:如何将 System.err 显式重定向到控制台(即恢复默认行为)?

javascript - 正则表达式提取模式之间的文本

scala - 为什么空字符串与 Seq.empty 不匹配?

scala - 如何匹配多个参数?