Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 有没有办法在RE2中指定字符前后进行匹配?_Regex_Google Bigquery_Re2 - Fatal编程技术网

Regex 有没有办法在RE2中指定字符前后进行匹配?

Regex 有没有办法在RE2中指定字符前后进行匹配?,regex,google-bigquery,re2,Regex,Google Bigquery,Re2,我需要在较大的文档中查找可能是信用卡详细信息的数字,例如346490606109917。我想忽略其中包含信用卡样式详细信息的较大数字,例如96213464906061099171 在常规正则表达式中(请原谅这个双关语),我可以使用(?在模式的开头和(?![0-9])结尾,这样只有与信用卡格式完全匹配的数字才会被匹配,而其中可能包含信用卡类型数字的较大数字将被忽略。数字两侧的非数字字符都可以 我的模式是 (?<![0-9])(4[0-9]{12}(?:[0-9]{3})?|(?:5[1-5]

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

在常规正则表达式中(请原谅这个双关语),我可以使用
(?在模式的开头和
(?![0-9])
结尾,这样只有与信用卡格式完全匹配的数字才会被匹配,而其中可能包含信用卡类型数字的较大数字将被忽略。数字两侧的非数字字符都可以

我的模式是

(?<![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])
(?
例如,在正常正则表达式中,它将在
abc346490606109917zyz上生成匹配,但在
abc96213464906061099171xyz上不生成匹配

然而,这正是BigQuery所使用的——它在文档中被列为“不受支持”


RE2中是否有一个等价物,或者它是不可能的?

下面是针对BigQuery标准SQL的

#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`   
结果如下

Row str                         check    
1   abc346490606109917zyz       true     
2   abc96213464906061099171xyz  false      
(^ |[^0-9])
部分标识字符串或非数字序列的开头。与
($|[^0-9])
相同,但它表示字符串或非数字序列的结尾,而不是开始

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

#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`   
结果将是

Row str                         check   number   
1   abc346490606109917zyz       true    346490606109917  
2   abc96213464906061099171xyz  false   null        

这里,在
REGEXP\u EXTRACT
中,您需要使用
(?:正则表达式)
表示非捕获组

提供一些输入和预期的示例output@MikhailBerlyant-问题已编辑,谢谢。我正在阅读你问题的第一句话,不知道它是否适合你的示例。你可能想重新审视并清理你的问题question@MikhailBerlyant-现在更有意义了吗?我想提供一些前男友大量的输入数据和预期的结果仍然会对回答问题有很大帮助完美!谢谢。