我正在使用C#,想用Regex捕获IP:PORT
,但是如果在PORT
之后字符是:
,如何使其不匹配?
测试here
模式:
(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})[:\s]+(\d{2,5})(?!:)
扩展结果
1.22.234.255:8181:u:p // true, it should be false
1.22.234.255:80 // true
1.22.234.255 8080 // true
dddd1.22.234.255 80808 // true
答案 0 :(得分:1)
问题是您的端口表达式(\d{2,5})
不能捕获所有数字。在意外通过的表达式中,如果您查看匹配组,则它们是1.22.234.255
和818
(不是 8181
)。该表达式的确拒绝1.22.234.255:8181
,因为它后跟一个:
,但是该表达式考虑一个3位数的端口并接受1.22.234.255:818
,因为下一个字符是1
,而不是:
。
弥补此问题的一种方法是通过更改模式以同时拒绝冒号和数字:
(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})[:\s]+(\d{2,5})(?![0-9:])
答案 1 :(得分:1)
此正则表达式适用于所有情况
(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s*(?::\s*)?(?<!\d)(\d{2,5})(?!\d|\s*:)
https://play.golang.org/p/RJuGK4cY1u-
可读版本
( # (1 start), IP
\d{1,3} \.
\d{1,3} \.
\d{1,3} \.
\d{1,3}
) # (1 end)
\s*
(?: : \s* )?
(?<! \d )
( \d{2,5} ) # (2), Port
(?! \d | \s* : )
答案 2 :(得分:0)
尝试使用两个不同的正则表达式,它将更简单
空格的表达式1:
(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+(\d{2,5})
表达式2不带空格,如果有多行,则必须确保它具有EOL字符或/ m修饰符:
(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\:(\d{2,5})$
与两者中的任何一个匹配并合并结果。