簡體   English   中英

用於捕獲數字模式的RegEx不跟隨其他字符

[英]RegEx for Capturing Number Patterns not Followed by Other Characters

我正在使用C#並希望捕獲IP:PORT使用Regex進行IP:PORT ,但是如果在PORT后該字符是:

在這里測試一下

圖案:

(\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

問題是您的端口表達式(\\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:])

這個正則表達式適用於所有情況

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

嘗試使用兩種不同的正則表達式,它會更簡單

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

匹配任何兩個並合並結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM