【问题标题】:RegEx for Capturing Number Patterns not Followed by Other Characters用于捕获其他字符不跟随的数字模式的正则表达式
【发布时间】:2019-10-02 19:10:53
【问题描述】:

我正在使用 C# 并想用正则表达式捕获 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

【问题讨论】:

  • 你要匹配ip地址吗?
  • 是的,但这不是问题,它不需要是有效 IP
  • 看看IPAddress.TryParse(),而不是正则表达式
  • 也看看这个question
  • 我不是在验证 IP,而是从随机字符串中捕获IP:PORT

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


【解决方案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:])

【讨论】:

    【解决方案2】:

    这个正则表达式适用于所有情况

    (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s*(?::\s*)?(?<!\d)(\d{2,5})(?!\d|\s*:)

    https://regex101.com/r/5faUcx/1

    可读版本

     (                             # (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* : )
    

    【讨论】:

      【解决方案3】:

      尝试使用两个不同的正则表达式,会更简单

      空格表达式 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})$
      

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

      【讨论】:

      • 谢谢,它是随机字符串,我不能使用^$,因为值可能在中间,分隔符应该是冒号或空格[:\s]
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-10
      • 2023-03-15
      • 2019-10-15
      • 1970-01-01
      • 2019-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多