有些地方还是不明白
1:[\d:]{5,8} 匹配五到八位由十进制数字和冒号组成的字符串 (为什么是5到8位呢?)
2:\d\.]{7,15} 1,匹配七到十五位由十进制数字和点号组成的字符串 (为什么是7到10位呢?)
3:(?(?=\[[\d]+\])\[([\d]+)\]) 条件匹配 如有匹配 [一位或多位十进制数字] 的字符串 则取出数字,即执行后面的 \[([\d]+)\] 匹配(看不怎么懂)
1:[\d:]{5,8} 匹配五到八位由十进制数字和冒号组成的字符串 (为什么是5到8位呢?)
2:\d\.]{7,15} 1,匹配七到十五位由十进制数字和点号组成的字符串 (为什么是7到10位呢?)
3:(?(?=\[[\d]+\])\[([\d]+)\]) 条件匹配 如有匹配 [一位或多位十进制数字] 的字符串 则取出数字,即执行后面的 \[([\d]+)\] 匹配(看不怎么懂)
[\d:]{5,8} 5,匹配五到八位由十进制数字和冒号组成的字符串 ;
因为时间最长八位,最短五位
10:02:10 8个字符 0:0:0 5个字符[\d\.]{7,15} 1,匹配七到十五位由十进制数字和点号组成的字符串
同理,IP最长十五位,最短七位
192.168.168.168 15位 0.0.0.0 7位
不过和上面的一样。那个端口的匹配是怎么回事?有点没看懂。
望楼主给解答一下。谢谢。
\[([\d]+)\] 以中括号左面“[”开始 子模式:是一个或多个十进制数字 中括号右边“]”
主要就是为了看有没有匹配上面的模式,如果有的话输出下面的那个正则里的子模式
也不知道我理解的对不对。呵。。
/[\d:]{5,8}/你是可以匹配出他这个题目里的时间,但是匹配的格式其实是不正确的。。该正则表达式还可以匹配12311:22 这样的字符串。/\d[1,2]:\d[1,2]:\d[1,2]/ 这样好些。。但是这个也不规范。。因为没有考虑到时间的取值范围
/[\d:]{5,8}/
这是一个惯用技巧(或窍门,Hack……).
这个Log的格式是固定的,时间是双位补0的,这时你不必考虑像你提出的 12311:22 这种字符串.
就算有 12311:22 出现.我们有责任将其提取出来,而并不是当作不匹配记录忽略掉.
Ip也是同理,如果要匹配到IPv6改变其最大长度为 23(5*1+3*6) 即可.端口的提取用的是
Conditional subpatterns
源例是这样的(?(condition)yes-pattern)
(?(condition)yes-pattern|no-pattern)范例 (?(?=[^a-z]*[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} )
你可以这样理解
如字符串符合 condition 则 这整个子句,即(?(condition)yes-pattern)或(?(condition)yes-pattern|no-pattern)被替换为yes-pattern.
反之如字符串不匹配 condition 则着整个子句被替换为no-pattern.如no-pattern不存在则整个子句被替换为空.而
(?(?=\[[\d]+\])\[([\d]+)\])
意思就是:如果字符串 由[开头]结尾且中间包含至少1个十进制数字即/\[[\d]+\]/ 则 进行后面的子匹配即 /\[([\d]+)\]/ .