Java中的正则表达式:匹配组直到第一个符号出现

时间:2017-02-25 20:00:14

标签: java regex

我的字符串如下所示:

"Chitkara DK, Rawat DJY, Talley N. The epidemiology of childhood recurrent abdominal pain in Western countries: a systematic review. Am J Gastroenterol. 2005;100(8):1868-75. DOI."

我想要的是获得大写字母(仅作为单独的单词)直到第一个点,得到:DK DJY N。但不是其他人物,比如J DOI

这是Java类Pattern的代码部分:

\\b[A-Z]{1,3}\\b

正则表达式中是否有一般选项可以在某个字符后停止匹配?

2 个答案:

答案 0 :(得分:5)

您可以使用\G使用contionous匹配,并从第一个捕获组中提取您想要的匹配项:

(?:\\G|^)[^.]+?\\b([A-Z]{1,3})\\b

您需要使用MULTILINE标志在多行上下文中使用它。如果您的内容始终是一行,则可以从模式中删除|^

请参阅https://regex101.com/r/JXIu21/3

请注意,regex101使用PCRE模式,但所有使用的功能也可以在Java regex中使用。

答案 1 :(得分:2)

Sebastian Proske的答案很棒,但将复杂的解析任务分成不同的步骤往往更容易(也更易读)。我们可以将您的目标分成两个单独的步骤,从而使用您的原始模式创建一个更简单,更清晰正确的解决方案。

private static final Pattern UPPER_CASE_ABBV_PATTERN = Pattern.compile("\\b[A-Z]{1,3}\\b");

public static List<String> getAbbreviationsInFirstSentence(String input) {
  // isolate the first sentence, since that's all we care about
  String firstSentence = input.split("\\.")[0];
  // then look for matches in the first sentence
  Matcher m = UPPER_CASE_ABBV_PATTERN.matcher(firstSentence);
  List<String> results = new ArrayList<>();
  while (m.find()) {
    results.add(m.group());
  }
  return results;
}