Google表格中的正则表达式正向后查找

6
我有一份包含交易列表的Google表格。我需要从列D中的单词“end”后面的列E中的最多三个单词或数字。适当的正则表达式函数应该是正向预查,但在RE2中不支持它(来源:使用正向预查(?=regex)与re2)。
这个公式在GSheets中会返回错误:
=REGEXEXTRACT(D1;"(?<=end\s)(\w+)")

因此,我的结论是在这种情况下正则表达式行不通。

我如何在GSheets中获得所需的结果?


你不能只使用=REGEXEXTRACT(D1;"end\s*(\w+)")吗?能否请您提供D1中字符串的示例和期望的结果?如果您需要1、2或3个以空格分隔的单词,您将需要类似于"end\s*(\w+(?:\s+\w+){0,2})"的东西。 - Wiktor Stribiżew
2个回答

7

您可以在正则表达式中使用捕获组,使得REGEXEXTRACT仅返回该捕获组匹配的部分:

=REGEXEXTRACT(D1;"end\s*(\w+)")

如果您需要在end之后返回1个、2个或3个由空格分隔的单词,请使用:
=REGEXEXTRACT(D1;"end\s*(\w+(?:\s+\w+){0,2})")

查看在线演示(Golang正则表达式也使用RE2)。

详情

  • end - end
  • \s* - 0个或多个空格
  • (\w+(?:\s+\w+){0,2}) - 捕获组1:
    • \w+ - 1个或多个字母、数字或下划线字符
    • (?:\s+\w+){0,2} - 0次、1次或2次出现
      • \s+ - 1个或多个空格
      • \w+ - 1个或多个字母、数字或下划线字符。

4
如果您非常需要一个与RE2不同的RegEx后端,那么您可以使用应用脚本创建一个自定义函数,该函数使用JS来评估RegEx。
步骤如下:
1. 点击工具 > 脚本编辑器。 2. 在编辑器中添加您的自定义JS RegEx函数。您可以使用下面的示例。 3. 给它起一个名字,JS_REGEXEXTRACT是一个很好的选择。 4. 在工具栏中点击保存按钮。 5. 返回到您的Sheet所在的浏览器选项卡,并将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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接