BigQuery REGEXP_MATCH 和重音:边界通配符失败?

2024-05-13

在 GAS 中,我可以正确地将重音符号与具有边界字符的正则表达式相匹配,例如 \bà\b。仅当字符 à 是单独的单词时才匹配。这在 GAS 中有效:

function test_regExp() {
  var str = "la séance est à Paris";
  var RegExp = "\\bà\\b";
  var PatReg= new RegExp( RegExp);
  var found=PatReg.exec(str);
  if (found) {
    Logger.log( [str.substring(0,found.index),found[0],str.substring(found[0].length+found.index)] );
  } else Logger.log("oops! Did not match");

在 BigQuery 中,如果边界字符位于重音符号旁边,则模式不匹配。 \bséance\b 匹配降神会:

SELECT [row],etext,ftext FROM [hcd.hdctextx] WHERE (REGEXP_MATCH(ftext,"\\bséance\\b") ) LIMIT 100;

\bà\b 与单词 à 不匹配:

SELECT [row],etext,ftext FROM [hcd.hdctextx] WHERE (REGEXP_MATCH(ftext,"\\bà\\b") ) LIMIT 100;

我假设 BigQuery 与 GAS 不同,在边界字符集中包含重音符号。所以 \bséance\b 起作用是因为 é 可以在该配置中作为边界正常工作。 \bà\b 或 \bétranger\b 或 \bmarché\b 不起作用,因为重音 + \b 被解释为 \b\b,它从不匹配任何内容。 (好吧,我在这里抓住救命稻草,因为我找不到更好的解释......除了一个错误。)

我不认为这是一个 unicode 问题,因为它只出现在边界位置。

因此,目前还无法在这些特定的重音配置中使用边界。

有没有办法在 BigQuery 或其他修复中设置区域设置?

解决方法:用 (?:[^a-zA-Zéàïëâê]) 等替换 \b。

Thanks!


BigQuery 的行为是正确的RE2 语法文档 https://code.google.com/p/re2/wiki/Syntax。 (这并不奇怪,因为 BigQuery 使用 RE2 来实现正则表达式。)

RE2 的角色类别是:

\b = at word boundary (\w on one side and \W, \A, or \z on the other)
\w = word characters (≡ [0-9A-Za-z_])
\W = not word characters (≡ [^0-9A-Za-z_])
\A = beginning of text
\z = end of text

换句话说,只能使用 \b 来匹配非重音字符的边界。不过,RE2 对 Unicode 字符有大量支持,因此您很可能可以使用 \pL 之类的东西来制作替代正则表达式。

我不确定为什么 Google Apps 脚本不遵循此处的 RE2 规范,但我会跟进该团队以弄清楚发生了什么。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BigQuery REGEXP_MATCH 和重音:边界通配符失败? 的相关文章

随机推荐