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

wgw*_*wgw 1 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");
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

我假设BigQuery与GAS不同,它在边界字符集中包含重音.所以\bséance\ b有效,因为é可以在该配置中作为边界正常运行.\bà\ b或\bétranger\ b或\bmarché\ b不起作用,因为重音+\b被解释为\ b\b,它永远不会匹配任何东西.(好吧,我在这里抓住吸管,因为我找不到更好的解释......除了一个bug.)

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

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

有没有办法在BigQuery或其他修复程序中设置Locale?

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

谢谢!

N.N*_*.N. 5

看一下这个:

SElect Regexp_extract(StringToParse,r'\b?(à)\b?') as Extract,
 Regexp_match(StringToParse,r'\b?(à)\b?') as match,
FROM
(SELECT 'la séance est à Paris' as StringToParse)
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助

  • 让我倒退:**r'\ b?(à)\ b?' 不能在BQ**工作,因为它也会检索Voilà,因为\ b?可以忽略.因此它会找到所有à,而不是单个单词,这是\ b ...\b表达式可以做的.(你的建议仍然有用,因为它鼓励我探索其他同义词.谢谢!) (2认同)

Jer*_*dit 5

BigQuery 的行为在RE2 语法文档方面是正确的。(这并不奇怪,因为 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
Run Code Online (Sandbox Code Playgroud)

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

我不确定为什么 Google Apps Script 不遵循这里的 RE2 规范,但我会跟进该团队以找出发生了什么。