首页 > 解决方案 > 在搜索连续数字时结合忽略http行

问题描述

我正在完成的是在每一行中搜索连续的 8 位数字。我有那个工作。

这是正则表达式:

  ^.*(\b[0-9]{8}\b)$

这是测试数据:它在每一行上拾取每个连续的数字。

1. This is my account number 32145678
2. t 12345678
3. 43215678
4. 54321678

现在,我正在做的是忽略其中包含 https 或 http 的任何行。

(?is)^(?!http:|https:)$|^.*(\b[0-9]{8}\b)$

下面是测试数据。第 1、2、4、5、6、7 行应该匹配。第 3 行应该被忽略。

1. 87654321
2. 12345678
3. http://example.org/app=87654321
4. This is my account number 32145678
5. t 12345678
6. 43215678
7. 54321678

现在发生的只是第 7 行匹配。有人可以解释我做错了什么吗?

谢谢,

拉斯

标签: regex

解决方案


在您尝试的模式中,^(?!http:|https:)$|^.*(\b[0-9]{8}\b)$第一部分^(?!http:|https:)$将只匹配一个空字符串。

这意味着匹配任何断言右边的内容不是http:或的空字符串https:

您使用了 inline s修饰符,这将使第二部分中的点^.*(\b[0-9]{8}\b)$与换行符匹配。

所有这些值一个接一个,捕获组将捕获所有值的最后 8 位,这就是为什么您看到只有第 7 行被捕获。请参阅启用多行标志的演示)


您可以将模式更新为

(?mi)^(?!https?:).*\b(\d{8})$
  • (?mi)多行和不区分大小写的内联修饰符
  • ^线的开始
  • (?!https?:)断言右边的内容不是 http: 或 https:
  • .*匹配除换行符以外的任何字符 0+ 次
  • \b(\d{8})字边界,捕获组 1中的 8 个数字
  • $行结束

正则表达式演示

请注意,您可以省略之间的单词边界\b)$


推荐阅读