寻找一种从文本字符串中只提取所有大写字母的单词的方法。问题是它不应该提取文本字符串中大小写混合的其他单词。例如,如何使用regex从以下句子中提取肯塔基州:在肯塔基州有很多选择我尝试使用Google Sheets中的regexextract()来实现这一点,它使用了RE2。期待听到你的想法。
regexextract()
oxcyiej71#
假设文本位于单元格A2中:如果每个文本段中只有一个示例,则此操作有效:
=REGEXEXTRACT(A2,"([A-Z]{2,})")
如果在一个文本片段中有多个示例,那么使用这个,它将动态调整正则表达式,为您提取每个示例:
=REGEXEXTRACT(A2, REPT(".* ([A-Z]{2,})", COUNTA(SPLIT(REGEXREPLACE(A2,"([A-Z]{2,})","$"),"$"))-1))
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]+
\p{Lu}
(?:\s+[A-Z]+)*
\s+
或者,如果允许大写字母之间使用任何标点或符号,则可以使用
=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字母和数字以外的任意一个或多个字符。
[^a-zA-Z0-9]+
[^\p{L}\p{N}]+
qncylg1j3#
这应该行得通:
\b[A-Z]+\b
参见demo
brjng4g34#
最后从其他很棒的帮助解决方案here和here中得到了这个更简单的方法:
=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中的输入:
C1
The friendly Quick Brown Fox from the woods Jumps Over the Lazy Dog from the farm.
A1中的输出:
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
4条答案
按热度按时间oxcyiej71#
假设文本位于单元格A2中:
如果每个文本段中只有一个示例,则此操作有效:
如果在一个文本片段中有多个示例,那么使用这个,它将动态调整正则表达式,为您提取每个示例:
cnwbcb6i2#
如果需要在ALLCAPS中提取整个单词块,请使用
参见this regex demo。
\b
-字边界[A-Z]+
-1 + ASCII字母(\p{Lu}
匹配任何Unicode字母,包括阿拉伯语等)(?:\s+[A-Z]+)*
-零次或多次重复\s+
-1+空格[A-Z]+
-1 + ASCII字母(\p{Lu}
匹配任何Unicode字母,包括阿拉伯语等)\b
-字边界。或者,如果允许大写字母之间使用任何标点或符号,则可以使用
参见regex demo。
这里,
[^a-zA-Z0-9]+
匹配ASCII字母和数字以外的一个或多个字符,[^\p{L}\p{N}]+
匹配Unicode字母和数字以外的任意一个或多个字符。qncylg1j3#
这应该行得通:
参见demo
brjng4g34#
第二次编辑全部大写/大写解答:
最后从其他很棒的帮助解决方案here和here中得到了这个更简单的方法:
根据此输入:
它返回以下输出:
标题大小写相同(提取所有大写字母/第一个字母作为大写单词:
公式:
C1
中的输入:A1
中的输出:之前效率较低的试验:
我不得不为我的用例定制它:
逐个检查所有异常,并将它们各自的正则表达式公式添加到regexextract函数中多个管道分隔的正则表达式的前面。
@Wiktor Stribizew任何简化建议都是非常受欢迎的。
发现少了一些,就把它们修好了。
一个简单的版本,但仍然相当冗长:
从本例中:
Multiple regex matches in Google Sheets formula