使用正则表达式仅提取 ALLCAPS 单词

Extract only ALLCAPS words with regex

正在寻找一种方法来仅从文本字符串中提取全部大写的单词。问题是它不应该提取文本字符串中大小写混合的其他单词。

例如,我如何使用正则表达式从以下句子中提取 KENTUCKY:

There Are Many Options in KENTUCKY

我正在尝试使用 Google 表格中的 regexextract() 执行此操作,它使用 RE2。

期待听到您的想法。

这应该有效:

\b[A-Z]+\b

demo

假设您的文本在单元格 A2 中:

如果每个文本段中只有一个实例,这将起作用:

=REGEXEXTRACT(A2,"([A-Z]{2,})")

如果单个文本段中有多个实例,那么使用它,它会动态调整正则表达式来为您提取每个实例:

=REGEXEXTRACT(A2, REPT(".* ([A-Z]{2,})", COUNTA(SPLIT(REGEXREPLACE(A2,"([A-Z]{2,})","$"),"$"))-1))

如果您需要提取全部大写单词,请使用

=REGEXEXTRACT(A2,"\b[A-Z]+(?:\s+[A-Z]+)*\b")
=REGEXEXTRACT(A2,"\b\p{Lu}+(?:\s+\p{Lu}+)*\b")

参见 this regex demo

详情

  • \b - 单词边界
  • [A-Z]+ - 1+ 个 ASCII 字母(\p{Lu} 匹配任何 Unicode 字母,包括阿拉伯语等)
  • (?:\s+[A-Z]+)* - 零次或多次重复
    • \s+ - 1+ 个空格
    • [A-Z]+ - 1+ 个 ASCII 字母(\p{Lu} 匹配任何 Unicode 字母,包括阿拉伯语等)
  • \b - 单词边界。

或者,如果您允许在大写字母之间使用任何标点符号或符号,您可以使用

=REGEXEXTRACT(A2,"\b[A-Z]+(?:[^a-zA-Z0-9]+[A-Z]+)*\b")
=REGEXEXTRACT(A2,"\b\p{Lu}+(?:[^\p{L}\p{N}]+\p{Lu}+)*\b")

参见regex demo

这里,[^a-zA-Z0-9]+匹配除ASCII字母和数字以外的一个或多个字符,[^\p{L}\p{N}]+匹配除任何Unicode字母和数字以外的任意一个或多个字符。