首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法匹配RE2中指定字符之前和之后的字符?

有没有办法匹配RE2中指定字符之前和之后的字符?
EN

Stack Overflow用户
提问于 2018-08-03 22:45:07
回答 1查看 911关注 0票数 0

我需要在较大的文档中查找数字,这些文档可能是信用卡详细信息,例如346490606109917。我希望忽略包含信用卡样式详细信息的较大数字,例如96213464906061099171

在常规的RegEx中(如果您不介意使用双关语),我可以在模式的开头使用(?<![0-9]),在结尾使用(?![0-9]),这样只有与信用卡格式完全匹配的数字才会被匹配,而其中可能包含信用卡样式号码的较大数字将被忽略。数字两边的非数字字符都可以。

我的模式是

代码语言:javascript
复制
(?<![0-9])(4[0-9]{12}(?:[0-9]{3})?|(?:5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|6(?:011|5[0-9]{2})[0-9]{12}|(?:2131|1800|35\d{3})\d{11})(?![0-9])

例如,在正常的RegEx中,它会在abc346490606109917zyz上产生匹配,但在abc96213464906061099171xyz上不会。

但是,BigQuery使用的this isn't supported in Regex2在文档中被列为“不受支持”。

在RE2中有没有等价物,或者这是不可能的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-04 02:01:47

下面是针对BigQuery标准SQL的说明

代码语言:javascript
复制
#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'abc346490606109917zyz' str UNION ALL
  SELECT 'abc96213464906061099171xyz'
)
SELECT *, REGEXP_CONTAINS(str, r'(^|[^0-9])(4[0-9]{12}(?:[0-9]{3})?|(?:5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|6(?:011|5[0-9]{2})[0-9]{12}|(?:2131|1800|35\d{3})\d{11})($|[^0-9])') check
FROM `project.dataset.table`   

结果如下

代码语言:javascript
复制
Row str                         check    
1   abc346490606109917zyz       true     
2   abc96213464906061099171xyz  false      

(^|[^0-9])部分标识字符串开始或非数字序列。与($|[^0-9])相同,但它指示字符串结束或非数字序列,而不是开始

如果您还需要提取卡号,请使用下面的示例

代码语言:javascript
复制
#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'abc346490606109917zyz' str UNION ALL
  SELECT 'abc96213464906061099171xyz'
)
SELECT *, 
  REGEXP_CONTAINS(str, r'(^|[^0-9])(4[0-9]{12}(?:[0-9]{3})?|(?:5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|6(?:011|5[0-9]{2})[0-9]{12}|(?:2131|1800|35\d{3})\d{11})($|[^0-9])') check,
  REGEXP_EXTRACT(str, r'(?:^|[^0-9])(4[0-9]{12}(?:[0-9]{3})?|(?:5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|6(?:011|5[0-9]{2})[0-9]{12}|(?:2131|1800|35\d{3})\d{11})(?:$|[^0-9])') number
FROM `project.dataset.table`   

结果将是

代码语言:javascript
复制
Row str                         check   number   
1   abc346490606109917zyz       true    346490606109917  
2   abc96213464906061099171xyz  false   null        

在这里,在REGEXP_EXTRACT中,您需要使用(?:regular_expression)来表示非捕获组

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51675121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档