我所完成的是在每一行中搜索连续的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
标志更改为m
。i
的意思是"单行",本质上意味着"将所有内容都视为单行。标记了i
后,.
将找到新的行字符。m
代表multiline
,这意味着^
和$
分别等于任何行的开头或结尾。 -
从
(http:|https:)
之后移除$
和|
。|
的意思是"或",您不想要或。在这种情况下,您希望找到一个由8个数字组成的字符串,这些数字前面没有http或https。此外,在regex模式中使用$
时,您表示http/https将位于字符串的末尾。
所以你最终应该得到:
(?im)^(?!http:|https:).*(b[0-9]{8}b)$