今天闲谈上最近写的正则表达式方法,对菜鸟来说绝对实用【回钦波】
////////////////// 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//////////////////////////////////