2

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

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

肯塔基州有很多选择

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

期待听到您的想法。

4

3 回答 3

1

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

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

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

如果单个文本段中有多个实例,则使用它,它将动态调整正则表达式以为您提取每个出现:

=REGEXEXTRACT(A2, REPT(".* ([A-Z]{2,})", COUNTA(SPLIT(REGEXREPLACE(A2,"([A-Z]{2,})","$"),"$"))-1))
于 2016-01-26T23:24:38.190 回答
0

如果您需要在 ALLCAPS 中提取整个单词块,请使用

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

请参阅此正则表达式演示

细节

  • \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")

请参阅正则表达式演示

在这里,[^a-zA-Z0-9]+匹配一个或多个字符而不是 ASCII 字母和数字,并[^\p{L}\p{N}]+匹配任何一个或多个字符而不是任何 Unicode 字母和数字。

于 2020-03-18T11:53:51.993 回答
0

这应该有效:

\b[A-Z]+\b

演示

于 2016-01-26T17:04:09.147 回答