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.
谢谢!
看一下这个:
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)
希望这可以帮助
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 规范,但我会跟进该团队以找出发生了什么。