首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

今天闲谈上最近写的正则表达式方法,对菜鸟来说绝对实用【回钦波】

2012-09-05 
今天闲谈下最近写的正则表达式方法,对初学者来说绝对实用【回钦波】////////////////// test1??? ADD_START-

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

////////////////// 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//////////////////////////////////

热点排行