Regex调整以在Google Sheets中工作REGEXTRACT公式

tktrz96b  于 2023-03-31  发布在  Go
关注(0)|答案(2)|浏览(93)

我需要在Google表格单元格中使用一个公式,该公式将从另一个单元格中的数据中提取第一个巴西电话号码。电话号码将位于HTML代码的中间,例如:
1.示例1:<a href="tel:1123456789" class="btn-tel">(11) 2345-6789</a>〉〉〉将返回第一个数字::1123456789
1.示例2:<strong>3003-1234</strong>〉〉〉将返回:3003-1234
1.示例3:<a _ngcontent-iqq-c82="" href="tel:30031234" class="ng-tns-c82-0">3003-1025 </a>〉〉〉将返回:30031234
有三种不同类型的数字:

  • 0800abcdefg:其中abcdefg可以是从0到9的数字,并且该数字可以表示为:0800 abcdefg、0800 abc defg或0 800 abc defg。
  • XXXXabcd:其中XXXX可以是3003、3004、4003、4004或4020,abcd可以是从0到9的数字。这种类型的数字可以表示为:XXXX-abcd、XXXXabcd、XXXX abcd或XXXX.abcd
  • XXabcdefgh:其中XX是一个永远不会有0的数字(没有10,03,30...),并且不能是以下数字之一:23、2 - 5、26、29、36、39、52、56、57、58、59、72、76或78。a数可以仅为2-5,b、c、d、e、f、g和h可以为0至9的数。(XX)abcdefgh,(XX)abcd.efgh,(XX)abcd-efgh,XXabcdefgh,XX abcd efgh,XX.abcd.efgh,XX abcd-efgh

我尝试在Google表格中使用以下正则表达式和公式REGEXTRACT,但它返回错误,说它不是有效的正则表达式:
(23|25|26|29|36|39|52|56|57|58|59|72|76|78)(?:(((?)([1-9]{2})()?)(?)[2-5])[0-9]{3}|3003|3004|4003|4004|4020|0(?)800)(-?|.?|?[0-9]{3})(-?|.?|?)[0-9]{4}
虽然它可能不是一个最佳的正则表达式,但我已经在https://regex101.com/上尝试过了,它工作得很好。
如果这是不可能的,正则表达式可以认为数字将仅以数字形式呈现,例如:0800 abcdefg、XXXXabcd或XXabcdefgh。

laawzig2

laawzig21#

这个复杂的正则表达式工作:

0\s*800\d{3}\s*\d{4}|(?:300[34]|400[34]|4020)[\s\.-]?\d{4}|\(?(?:[14689]\d|2[^356\D]|3[^69\D]|5[^267-9\D]|7[^268\D])\)?\s*\d{4}[\s\.-]?\d{4}

我们将其分为3个备选方案,由|分隔,以满足您的3个要求:

  • 0\s*800\d{3}\s*\d{4}-这匹配08000 800,后跟3和4位数字,可能由空格分隔
  • (?:300[34]|400[34]|4020)[\s\.-]?\d{4}-匹配30033004400340044020,然后用一个空格分隔4个数字,.-。我们使用非捕获组作为替代,以便REGEXEXTRACT考虑整个匹配,否则它将考虑第一个匹配的所有组。
  • \(?(?:[14689]\d|2[^356\D]|3[^69\D]|5[^267-9\D]|7[^268\D])\)?[\s\.]?\d{4}[\s\.-]?\d{4}-是混乱的部分,首先所有可能的两位数代码可选地被() Package 。我们使用不可能的负前瞻,而不是使用我们不想要的数字作为组合,并在集合中包括\D非数字。然后它类似于上面的一个,但不是匹配前4个字符的4个数字,而不是特定的数字。

Demo
第二种和第三种可能被组合起来以缩短正则表达式,但我不想麻烦,因为它只是针对工作表的。这种长语法确保了所有的可能性都被考虑到了。
编辑:为了将multiple与regex匹配,显然可以尝试创建自己的函数,如this one

xhv8bpkk

xhv8bpkk2#

您可以尝试:

=let(Σ,join("|","0800\d{7}","3003\d{4}","3004\d{4}","4003\d{4}","4004\d{4}","4020\d{4}",
            join("[2-5]\d{7}|",filter(sequence(88,1,11,1),iserror(xmatch(sequence(88,1,11,1),{23,25,26,29,36,39,52,56,57,58,59,72,76,78,20,30,40,50,60,70,80,90}))))&"[2-5]\d{7}"),
     index(if(len(A:A),ifna(regexextract(regexreplace(regexreplace(A:A&"","[^(\d\s-\.)]","🐠"),"[^\d🐠]",""),Σ),"-"),)))
    • 请使用更多的数据样本进行测试,以确保不会出现任何误报 *

相关问题