我的字符串如下所示:
"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
正则表达式中是否有一般选项可以在某个字符后停止匹配?
答案 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;
}