组合在搜索连续数字时忽略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号线在比赛。有人能解释一下我做错了什么吗?

谢谢,

Russ

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

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

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

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


您可以将图案更新为

(?mi)^(?!https?:).*b(d{8})$
  • (?mi)用于多行和不区分大小写的内联修饰符
  • ^线路起点
  • (?!https?:)断言直接在右边的不是http:或https:
  • .*匹配除换行符以外的任何字符0+次
  • b(d{8})字边界,捕获组1中的8位数字
  • $线路末端

Regex演示

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

两点:

  • i标志更改为mi的意思是"单行",本质上意味着"将所有内容都视为单行。标记了i后,.将找到新的行字符。m代表multiline,这意味着^$分别等于任何行的开头或结尾。

  • (http:|https:)之后移除$||的意思是"或",您不想要或。在这种情况下,您希望找到一个由8个数字组成的字符串,这些数字前面没有http或https。此外,在regex模式中使用$时,您表示http/https将位于字符串的末尾。

所以你最终应该得到:

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

相关内容

最新更新