【正则表达式】IPv4地址的正则匹配
先亮結論,不想看分析的可以點個贊直接溜!
\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\b
下面是合理性分析:
IPv4地址的格式是nnn.nnn.nnn.nnn,其中每一個nnn為0~255之間的整數。
\b匹配一個單詞邊界,即字與空格間的位置。比如\bCha可匹配Chapter,而ter\b也可以匹配Chapter。
剩下的內容是(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9]),其中反復出現的一個子結構是25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9],它匹配的是0~255。
[0-9]表示0~9的任一整數,[01]表示0或1,|表示或,而?表示出現0次或1次。
所以這個子結構可以解釋為:0~9或10~99或100~199或200~255,綜合起來就是0~255。
值得注意的是畢竟不能把1表示為001,所以這里的處理稍顯復雜。
假設用A代指25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9],剩下的內容變成了(?:(?:A)\.){3}(?:A)。
(?:)是一個結構,表示非捕獲分組。
()表示捕獲分組,()會把每個分組里的匹配的值緩存,使用$n(n是一個整數,表示第n個捕獲組的內容)可用。
但使用圓括號會有一個副作用,使相關的匹配會被緩存,此時可用?:放在第一個選項前(即(?:))來消除這種副作用。
.表示除換行符外的任何字符,所以需要加反斜線以轉義點號,即為\.。
因此(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.)的含義是一個0~255的整數加上一個點號。
而{3}表示將之前的內容重復3次,即將一個0~255的整數加上一個點號這個內容重復3次。
最后再補上一個0~255的整數,即為所求。
總結
以上是生活随笔為你收集整理的【正则表达式】IPv4地址的正则匹配的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 作者:杨丽彬,华侨大学信息管理系讲师。
- 下一篇: 2016中国国际大数据大会预热活动启航,