当前位置: 首页 > 知识库问答 >
问题:

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

司马自明
2023-03-14

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

在常规正则表达式中(请原谅这个双关语),我可以使用(?

我的模式是

(?<![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使用的Regex2不支持它-它在留档中被列为“不支持”。

RE2中是否存在等价物,还是不可能?


共有1个答案

郑星辰
2023-03-14
匿名用户

下面是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中,您需要使用(?:正则表达式)来表示非捕获组

 类似资料:
  • 如何在RE2中为“不以4或5开头的匹配字符串”编写正则表达式? 在PCRE中,我会使用,但RE2不支持该语法。

  • 问题内容: 假设我有一个PHP函数foo: 有什么办法只能指定第二个可选参数? 例: 问题答案: PHP本身不支持命名参数作为函数。但是,有一些方法可以解决此问题: 使用数组作为该函数的唯一参数。然后,您可以从数组中提取值。这允许在数组中使用命名参数。 如果要根据上下文允许可选数量的参数,则可以使用func_num_args和func_get_args而不是在函数定义中指定有效参数。然后,根据参数

  • 我有一个字符串,有一些双引号转义了,有一些没有转义。像这样, 该字符串转换为文字。现在,我正在使用上面的正则表达式来替换非转义双引号。并且只有第二个双引号必须被替换。

  • 我试图找出我的字符串是否包含从a到z的所有字母 我们可以通过其他方法解决这个问题,但我正在尝试仅使用模式和匹配器来解决它。

  • 问题内容: 我希望使用番石榴将其连接成一个字符串,但列表中的每个字符串周围都有环绕的字符串。所以我想列出一个字符串列表: 并生成此字符串: 我看到的示例似乎是生成3个以逗号分隔的名称,但我希望每个字符串都包含一些额外的字符串(每次都相同)。 我希望我在这里足够清楚。谢谢你的帮助。 问题答案: 为此,首先要进行转换:

  • 我正试图在表格上做错误检查。我想看看一个电话号码是否有效,看它是否包含所有号码。有没有办法确定一个字符串中是否只有NMBER?