regex - BigQuery REGEXP_MATCH 和口音 : boundary wildcard fails?

标签 regex google-apps-script google-bigquery

在 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。

谢谢!

最佳答案

BigQuery 的行为对于 RE2 syntax documentation 来说是正确的. (这并不奇怪,因为 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 Script 不遵循 RE2 规范,但我会跟进该团队以了解发生了什么。

关于regex - BigQuery REGEXP_MATCH 和口音 : boundary wildcard fails?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22160406/

相关文章:

google-bigquery - 如何计算bigquery行大小?

google-bigquery - 如何捕获 BigQueryIO.Write 抛出的任何异常并挽救输出失败的数据?

ruby-on-rails - 如何在 ruby​​ 中使用 utf8 的正则表达式

javascript - 如何使用 javascript 动态插入 Google Web 应用程序 URL

javascript - 如何为电子表格设置谷歌 GAS 数组的值

google-bigquery - 使用满足条件后重置的聚合函数?

regex - 正则表达式排除一个词

java - 为什么\B 有效但不\b

java - JSoup 似乎忽略字符代码?

javascript - 具有先前功能错误的 Google 应用程序脚本搜索 UI 工具