正则表达式,用于捕获其他字符不跟在其后的数字模式

时间:2019-05-15 15:19:19

标签: c# regex regex-lookarounds regex-group

我正在使用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

3 个答案:

答案 0 :(得分:1)

问题是您的端口表达式(\d{2,5})不能捕获所有数字。在意外通过的表达式中,如果您查看匹配组,则它们是1.22.234.255818不是 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})$

与两者中的任何一个匹配并合并结果。