有些地方还是不明白
1:[\d:]{5,8}    匹配五到八位由十进制数字和冒号组成的字符串 (为什么是5到8位呢?)
2:\d\.]{7,15}  1,匹配七到十五位由十进制数字和点号组成的字符串 (为什么是7到10位呢?)
3:(?(?=\[[\d]+\])\[([\d]+)\]) 条件匹配 如有匹配 [一位或多位十进制数字] 的字符串 则取出数字,即执行后面的 \[([\d]+)\] 匹配(看不怎么懂)

解决方案 »

  1.   

    楼主写的真是精彩。
    [\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位
    不过和上面的一样。那个端口的匹配是怎么回事?有点没看懂。
    望楼主给解答一下。谢谢。
      

  2.   

    (?(?=expression)yes|no)替换构造。(?(?=\[[\d]+\])\[([\d]+)\]) 1,条件匹配 如有匹配 [一位或多位十进制数字] 的字符串 则取出数字,即执行后面的 \[([\d]+)\] 匹配.\[[\d]+\]    以中括号左面“[”开始,里面有一个或多个十进制数字,然后是中括号号右边“]”结束
    \[([\d]+)\]  以中括号左面“[”开始    子模式:是一个或多个十进制数字    中括号右边“]”
    主要就是为了看有没有匹配上面的模式,如果有的话输出下面的那个正则里的子模式
    也不知道我理解的对不对。呵。。
      

  3.   

    我发现你写的不规范。例如:
    /[\d:]{5,8}/你是可以匹配出他这个题目里的时间,但是匹配的格式其实是不正确的。。该正则表达式还可以匹配12311:22  这样的字符串。/\d[1,2]:\d[1,2]:\d[1,2]/   这样好些。。但是这个也不规范。。因为没有考虑到时间的取值范围   
      

  4.   


    /[\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]+)\]/ .