【问题标题】:Regexmatch syntax for Google SheetsGoogle 表格的正则表达式匹配语法
【发布时间】:2019-01-14 21:05:01
【问题描述】:

单元格 A1 包含:

I finally found the best dance partner!! #ad, check out the link in bio

单元格 B1 包含:

=REGEXMATCH(A1,"/#[aA][dD](?![A-z]|[0-9]|-|_|\/|\\)/")

According to different regex testers,模式

#[aA][dD](?![A-z]|[0-9]|-|_|\/|\\)

有效且应与 A1 中的字符串匹配。 REGEXMATCH 应该返回 TRUE,而不是错误。我还尝试了没有开头和结尾斜杠的公式,但无济于事:

=REGEXMATCH(L2,"#[aA][dD](?![A-z]|[0-9]|-|_|\/|\\)")

我在这两种情况下遇到的错误是:

"函数REGEXMATCH参数2值 "#[aA]dD" 不是有效的正则 表达。”

我不知道我的 Google 表格的正则表达式语法有什么问题,而且我找不到 Google 或其他人在线提供的任何文档。

【问题讨论】:

  • RE2 库不支持前瞻。

标签: regex google-sheets google-sheets-formula


【解决方案1】:

RE2 库不支持前瞻。也不支持带有分隔符的正则表达式文字符号,必须删除第一个和最后一个斜杠,否则它们将被解析为正则表达式模式的一部分。 [A-z] 不仅仅匹配字母,您应该将其写为[A-Za-z] 以匹配任何 ASCII 字母。

使用(?:$|[^a-z0-9_/\\-])代替(?![A-z]|[0-9]|-|_|\/|\\)(即等于(?![A-Za-z0-9_/\\-])):

=REGEXMATCH(A1,"(?i)#ad(?:$|[^a-z0-9_/\\-])")

(?i)是不区分大小写的修饰符,不用写[aA]

详情

  • (?i) - 不区分大小写模式开启
  • #ad - #ad 子字符串
  • (?:$|[^a-z0-9_/\\-]) - 字符串结尾 ($) 或 (|) 除字母数字以外的任何字符,_/\- 字符。

【讨论】:

  • 太棒了。这做到了!一旦我被允许,将在 3 分钟内接受答案。对于未来的浏览器,我是否正确地说这是人们应该用于 Google Sheet 正则表达式的语法库? github.com/google/re2/wiki/Syntax
  • @PercentSharp 是的,这是相关的参考资料。
  • 如何在正则表达式中添加额外的子字符串?即,如果我想将#ad 和 #advert 都与正则表达式匹配?
  • 也许 =REGEXMATCH(X5,"(?i)#ad(?:$|[^a-z0-9_/\\-])|#advert(?:$|[^a -z0-9_/\\-])|#advertisement(?:$|[^a-z0-9_/\\-])|#sp(?:$|[^a-z0-9_/\\- ])|#spon(?:$|[^a-z0-9_/\\-])|#赞助(?:$|[^a-z0-9_/\\-])|#partner(?: $|[^a-z0-9_/\\-])|#partnership(?:$|[^a-z0-9_/\\-])")
  • @PercentSharp 使用我在回答中显示的非捕获组:(?i)#(?:ad|advert)(?:$|[^a-z0-9_/\\-])。您可以添加更多替代方案,例如(?i)#(?:ad|advert|advertisement|sp|spon|sponsored|partner|partnership)(?:$|[^a-z0-9_/\\-])。您还可以使用可选组来收缩模式:(?i)#(?:ad(?:vert(?:isement)?)?|sp(?:on(?:sored)?)?|partner(?:ship)?)(?:$|[^a-z0-9_/\\-])
猜你喜欢
  • 2012-04-15
  • 2010-10-30
  • 1970-01-01
  • 2017-09-11
  • 1970-01-01
  • 2020-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多