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