我有一个带有交易清单的Google表格。我需要在D列中的“ end”一词之后的E列中最多隔离三个单词或数字。正确的正则表达式函数应该是正向后缀,但RE2不支持该正则表达式(来源:{{3 }}。
此公式在GSheets中返回错误: = REGEXEXTRACT(D1;“(?<= end \ s)(\ w +)”),所以我的意思是在这种情况下regex是死胡同。
如何在GSheets中获得请求的结果?
答案 0 :(得分:2)
您可以在正则表达式中使用捕获组,使REGEXEXTRACT
仅返回捕获的部分:
=REGEXEXTRACT(D1;"end\s*(\w+)")
如果您需要在end
之后返回1个,2个或3个空格分隔的单词,请使用
=REGEXEXTRACT(D1;"end\s*(\w+(?:\s+\w+){0,2})")
请参见online demo(Golang regex也使用RE2)。
详细信息
end
-end
\s*
-超过0个空格(\w+(?:\s+\w+){0,2})
-捕获组1:
\w+
-1个以上的字符字符(字母,数字或_
)(?:\s+\w+){0,2}
-出现0、1或2次
\s+
-超过1个空格\w+
-1个以上的字符字符。答案 1 :(得分:0)
如果您迫切需要除RE2之外的其他RegEx后端,则可以使用App脚本创建一个自定义函数,该函数使用JS来评估RegEx。
JS_REGEXEXTRACT
是一个不错的选择。REGEXEXTRACT
替换为JS_REGEXEXTRACT
。您现在有了一个可运行的JS基本RegEx选项。它的执行速度不及RE2实施的速度,因此请注意具有复杂表达式的大型数据集。
/**
* Extracts matching substrings according to a regular expression using JS not RE2.
*
* @param {"abcdefg"} text The input text.
* @param {"c.*f"} regular_expression The first part of `text` that matches this expression will be returned.
* @return Extracts matching substrings according to a regular expression.
* @customfunction
*/
function JS_REGEXEXTRACT(text, regular_expression) {
if (text.length < 1) {
return null;
}
matches = text.match(new RegExp(regular_expression))
if (matches && matches.length >= 1) {
return matches[1];
}
return matches;
}