`
huiqinbo
  • 浏览: 334115 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

今天闲谈下最近写的正则表达式方法,对初学者来说绝对实用【回钦波】

 
阅读更多

////////////////// test1    ADD_START-2012年02月03日  HUIQINBO/////////////////////////

 

public static void main(String args[]){

    String  line =  "     St Sc                  :huiqinbo"
                      +"    St Dt IP               :111.222.111.222"
                      +"    St IP TS               :0x32"
                      +"    St L4 Src Pt/IP te:80(0x50)"
                      +"    St L4 Dst Pt/IP ce:12";

 

    String  line =  "St L4 Src Pt/IP te:80(0x50)"; 

     .........

     String setL4SrcPortICMPtype = getValue(line, "St L4 Src Pt/IP te");

 

     调用getValue后的结果为80(0x50)

     ........
}

 

 

public static String getValue(String line, String attrName) {
        WALog.traceIn();

        if (line == null || attrName == null) {
            throw new IllegalArgumentException();
        }

        String quotedAttrName = Pattern.quote(attrName);

        try {
            Matcher matcher =
Pattern.compile(
                    quotedAttrName + "
\\s*:\\s*(\\S+)\\b").matcher(line);

            if (!matcher.find()) {
                WALog.traceOut();

                return "";
            }

            String value = matcher.group();
            WALog.traceOut();

            return value.substring(value.indexOf(':') + 1).trim();

        } catch (PatternSyntaxException e) {
            WALog.traceOut();

            return "";

        }

    }

 

////////////////// test1    ADD_END-2012年02月03日  HUIQINBO/////////////////////////

 

 

 

///////////////////////test2   ADD_START-2012年02月29日  HUIQINBO//////////////////////////////////

 

今天正好有点时间我来补充一下上面我没有写完的方法:

其实上面的  getValue(String line, String attrName) 方法有不完美之处,为什么呢,因为如果你把我上面写好的程序copy到你的代码中去,会发现我上面写到的 调用getValue后的结果为80(0x50)】 会少一个右括号,正确结果是 80(0x50

 

那为什么会少一个右括号呢,你自己考虑下,因为我写的正则表达式是\\s*:\\s*(\\S+)\\b  它,最后是以 \\b 结尾的,\\b 是指已单词末尾结尾,所以自然右括号就被过虑掉了,那我们该如何来把正确的结果80(0x50)   显示出来呢,下面我再写一个方法来满足需求,真不想写,写完会大家写不给个好评呵:

 

public static String getValue1(String line, String attrName) {
        WALog.traceIn();

        if (line == null || attrName == null) {
            throw new IllegalArgumentException();
        }

        String quotedAttrName = Pattern.quote(attrName);

        try {
         // find key:xx(xx)
            Matcher matcher = Pattern.compile(
                    quotedAttrName + "\\s*:\\s*\\S*\\s*\\(\\s*(\\S+)\\s*\\)").matcher(line);

            if (!matcher.find()) {
             // find key:(xx)
                matcher = Pattern.compile(
                  quotedAttrName + "\\s*:\\s*\\(\\s*(\\S+)\\s*\\)").matcher(line);
               
                if (!matcher.find()) {
                 // find key:xx
                 matcher = Pattern.compile(
                         quotedAttrName + "\\s*:\\s*(\\S+)\\b").matcher(line);
                 if (!matcher.find()) {
                     WALog.traceOut();
 
                     return "";
                 }
                }
            }

            String value = matcher.group();
            WALog.traceOut();

            return value.substring(value.indexOf(':') + 1).trim();

        } catch (PatternSyntaxException e) {
            WALog.traceOut();

            return "";

        }

    }

 

上面的粉色部分就是来处理我们的需求的, 解释下吧,若不又有网友提出各种的问题

\\s*     是指0个或多个空格

\\S*     是指0个或多个字符

\\(       是指小括号的左部分

(\\S+)   一个或多个字符,当然可以把\\S+两边的括号去掉,我这里写是为了便于观客们易看

\\)       是指小括号的右部分

 

这回大家清楚了吧,这次的结果一写是  80(0x50)  

 

好了,更多交流、更多了解,请联系我

QQ:444084929 【回钦波】

个人主面 :http://www.huiqinbo.com

 

 

///////////////////////test2   ADD_START-2012年02月29日  HUIQINBO//////////////////////////////////

0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics