首页 > 解决方案 > 逗号之间的正则表达式单词

问题描述

我有以下类型的句子要过滤:

波兰、瑞典、美国的公民需要一些东西

波兰公民需要一些东西

美国公民需要一些东西

我想分开国家名称,然后保存它们。我为此构建了以下正则表达式机制。

String sentence;
[...]
Pattern pattern  = Pattern.compile("(?:Citizens of )? ([A-Z][a-z]+\\s*[A-Z]*[a-z]*) require");
Matcher matcher = pattern.matcher(sentence);
while (matcher.find())
        System.out.println(matcher.group(1));

它适用于 3 个案例中的 2 个;

  1. Citizens of Poland require something
  2. Citizens of United States require something

如果有多个单词,我如何构建一个正则表达式模式来获取单词?

标签: javaregex

解决方案


您可以在 Jave 中尝试使用此正则表达式,\G并向前看:

(?:^Citizens of|(?!^)\G,) ([A-Z][a-z]+(?: [A-Z][a-z]+)*)(?=[a-zA-Z, ]*? require something$)

正则表达式演示

正则表达式详细信息:

  • (?:启动非捕获组
    • ^Citizens ofCitizens of在开头匹配文本
    • |或者
    • (?!^)\G, \G在前一个匹配的结尾或第一个匹配的字符串的开头断言位置。我们在上一个国家名称匹配之后匹配一个逗号
  • )结束非捕获组
  • 匹配一个空格
  • (启动捕获组
  • [A-Z][a-z]+匹配一个大写单词
  • (?:启动非捕获组
    • [A-Z][a-z]+匹配空格后跟首字母大写的单词
  • )*结束非捕获组。*表示匹配该组的 0 个或多个
  • )结束非捕获组
  • (?=开始前瞻条件
    • [a-zA-Z, ]*? require something$在匹配文本之前断言我们有 0 个或多个字母、逗号或空格require something
  • )结束前瞻

推荐阅读