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

3zwjbxry  于 2023-02-20  发布在  其他
关注(0)|答案(4)|浏览(132)

寻找一种从文本字符串中只提取所有大写字母的单词的方法。问题是它不应该提取文本字符串中大小写混合的其他单词。
例如,如何使用regex从以下句子中提取肯塔基州:
在肯塔基州有很多选择
我尝试使用Google Sheets中的regexextract()来实现这一点,它使用了RE2。
期待听到你的想法。

oxcyiej7

oxcyiej71#

假设文本位于单元格A2中:
如果每个文本段中只有一个示例,则此操作有效:

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

如果在一个文本片段中有多个示例,那么使用这个,它将动态调整正则表达式,为您提取每个示例:

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

cnwbcb6i2#

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

=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字母和数字以外的任意一个或多个字符。

qncylg1j

qncylg1j3#

这应该行得通:

\b[A-Z]+\b

参见demo

brjng4g3

brjng4g34#

第二次编辑全部大写/大写解答:

最后从其他很棒的帮助解决方案herehere中得到了这个更简单的方法:

=trim(regexreplace(regexreplace(C15,"(?:([A-Z]{2,}))|.", " $1"), "(\s)([A-Z])","$1 $2"))

根据此输入:

isn'ter JOHN isn'tar DOE isn'ta or JANE

它返回以下输出:

JOHN DOE JANE

标题大小写相同(提取所有大写字母/第一个字母作为大写单词:

公式:

=trim(regexreplace(regexreplace(C1,"(?:([A-Z]([a-z]){1,}))|.", " $1"), "(\s)([A-Z])","$1 $2"))

C1中的输入:

The friendly Quick Brown Fox from the woods Jumps Over the Lazy Dog from the farm.

A1中的输出:

The Quick Brown Fox Jumps Over Lazy Dog

之前效率较低的试验:

我不得不为我的用例定制它:

= ArrayFormula(IF(REGEXMATCH(REGEXREPLACE(N3: N,
    "(^[A-Z]).+(,).+(\s[a-z]\s)|(^[A-Z][a-z]).+(\s[a-z][a-z]\s)|(^[A-Z]\s).+(\.\s[A-Z][a-z][a-z]\s)|[A-Z][a-z].+[0-9]|[A-Z][a-z].+[0-9]+|(^[A-Z]).+(\s[A-Z]$)|(^[A-Z]).+(\s[A-Z][a-z]).+(\s[A-Z])|(\s[A-Z][a-z]).+(\s[A-Z]\s).+(\s[A-Z])|(^[A-Z][a-z]).+(\s[A-Z]$)|(\s[A-Z]\s).+(\s[A-Z]\s)|(\s[A-Z]\s)|^[A-Z].+\s[A-Z]((\?)|(\!)|(\.)|(\.\.\.))|^[A-Z]'|^[A-Z]\s|\s[A-Z]'|[A-Z][a-z]|[a-z]{1,}|(^.+\s[A-Z]$)|(\.)|(-)|(--)|(\?)|(\!)|(,)|(\.\.\.)|(\()|(\))|(\')|("
    ")|(“)|(”)|(«)|(»)|(‘)|(’)|(<)|(>)|(\{)|(\})|(\[)|(\])|(;)|(:)|(@)|(#)|(\*)|(¦)|(\+)|(%)|(¬)|(&)|(|)|(¢)|($)|(£)|(`)|(^)|(€)|[0-9]|[0-9]+",
    ""), "[A-Z]{2,}") = FALSE, "", REGEXREPLACE(N3: N,
    "(^[A-Z]).+(,).+(\s[a-z]\s)|(^[A-Z][a-z]).+(\s[a-z][a-z]\s)|(^[A-Z]\s).+(\.\s[A-Z][a-z][a-z]\s)|[A-Z][a-z].+[0-9]|[A-Z][a-z].+[0-9]+|(^[A-Z]).+(\s[A-Z]$)|(^[A-Z]).+(\s[A-Z][a-z]).+(\s[A-Z])|(\s[A-Z][a-z]).+(\s[A-Z]\s).+(\s[A-Z])|(^[A-Z][a-z]).+(\s[A-Z]$)|(\s[A-Z]\s).+(\s[A-Z]\s)|(\s[A-Z]\s)|^[A-Z].+\s[A-Z]((\?)|(\!)|(\.)|(\.\.\.))|^[A-Z]'|^[A-Z]\s|\s[A-Z]'|[A-Z][a-z]|[a-z]{1,}|(^.+\s[A-Z]$)|(\.)|(-)|(--)|(\?)|(\!)|(,)|(\.\.\.)|(\()|(\))|(\')|("
    ")|(“)|(”)|(«)|(»)|(‘)|(’)|(<)|(>)|(\{)|(\})|(\[)|(\])|(;)|(:)|(@)|(#)|(\*)|(¦)|(\+)|(%)|(¬)|(&)|(|)|(¢)|($)|(£)|(`)|(^)|(€)|[0-9]|[0-9]+",
    "")))

逐个检查所有异常,并将它们各自的正则表达式公式添加到regexextract函数中多个管道分隔的正则表达式的前面。
@Wiktor Stribizew任何简化建议都是非常受欢迎的。
发现少了一些,就把它们修好了。

    • 第一次编辑**:

一个简单的版本,但仍然相当冗长:

= ArrayFormula(IF(REGEXMATCH(REGEXREPLACE(REGEXREPLACE(REGEXREPLACE(
            REGEXREPLACE(REGEXREPLACE(P3: P, "[a-z,]",
                " "), "-|\.", " "), "(^[A-Z]\s)", " "
            ), "(\s[A-Z]\s)", " "),
    "\sI'|\sI\s|^I'|^I\s|\sI(\.|\?|\!)|\sI$|\sA\s|^A\s|\.\.\.|\.|-|--|,|\?|\!|\.|\(|\)|'|"
    "|:|;|\'|“|”|«|»|‘|’|<|>|\{|\}|\[|\]|@|#|\*|¦|\+|%|¬|&|\||¢|$|£|`|^|€|[0-9]|[0-9]+",
    " "), "[A-Z]{2,}") = FALSE, " ", REGEXREPLACE(
    REGEXREPLACE(REGEXREPLACE(REGEXREPLACE(REGEXREPLACE(
            P3: P, "[a-z,]", " "), "-|\.", " "),
        "(^[A-Z]\s)", " "), "(\s[A-Z]\s)", " "),
    "\sI'|\sI\s|^I'|^I\s|\sI(\.|\?|\!)|\sI$|\sA\s|^A\s|\.\.\.|\.|-|--|,|\?|\!|\.|\(|\)|'|"
    "|:|;|\'|“|”|«|»|‘|’|<|>|\{|\}|\[|\]|@|#|\*|¦|\+|%|¬|&|\||¢|$|£|`|^|€|[0-9]|[0-9]+",
    " ")))

从本例中:
Multiple regex matches in Google Sheets formula

相关问题