有没有办法匹配 RE2 中指定字符的前后?
Is there a way to match before and after specified characters in RE2?
我需要在较大的文档中查找可能是信用卡详细信息的数字,例如346490606109917
。我想忽略其中包含信用卡样式详细信息的较大数字,例如96213464906061099171
.
在常规 RegEx 中(请原谅双关语),我可以在模式的开头使用 (?<![0-9])
,在结尾使用 (?![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])
例如,在正常的 RegEx 中会在 abc346490606109917zyz
上产生匹配,但在 abc96213464906061099171xyz
上不会产生匹配。
但是,this isn't supported in Regex2,这是 BigQuery 使用的 - 它在文档中列为 "not supported"。
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_EXTRACT
中需要用(?:regular_expression)
表示非捕获组
我需要在较大的文档中查找可能是信用卡详细信息的数字,例如346490606109917
。我想忽略其中包含信用卡样式详细信息的较大数字,例如96213464906061099171
.
在常规 RegEx 中(请原谅双关语),我可以在模式的开头使用 (?<![0-9])
,在结尾使用 (?![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])
例如,在正常的 RegEx 中会在 abc346490606109917zyz
上产生匹配,但在 abc96213464906061099171xyz
上不会产生匹配。
但是,this isn't supported in Regex2,这是 BigQuery 使用的 - 它在文档中列为 "not supported"。
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_EXTRACT
中需要用(?:regular_expression)
表示非捕获组