寻找一种仅从文本字符串中提取全部大写的单词的方法。问题是它不应该在混合大小写的文本字符串中提取其他单词。
例如,如何使用正则表达式从以下句子中提取 KENTUCKY:
肯塔基州有很多选择
我正在尝试regexextract()
在使用 RE2 的 Google 表格中执行此操作。
期待听到您的想法。
寻找一种仅从文本字符串中提取全部大写的单词的方法。问题是它不应该在混合大小写的文本字符串中提取其他单词。
例如,如何使用正则表达式从以下句子中提取 KENTUCKY:
肯塔基州有很多选择
我正在尝试regexextract()
在使用 RE2 的 Google 表格中执行此操作。
期待听到您的想法。
假装您的文本在单元格 A2 中:
如果每个文本段中只有一个实例,这将起作用:
=REGEXEXTRACT(A2,"([A-Z]{2,})")
如果单个文本段中有多个实例,则使用它,它将动态调整正则表达式以为您提取每个出现:
=REGEXEXTRACT(A2, REPT(".* ([A-Z]{2,})", COUNTA(SPLIT(REGEXREPLACE(A2,"([A-Z]{2,})","$"),"$"))-1))
如果您需要在 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 字母和数字。