零宽断言
1、有这样的需求,请求一个接口返回下面的xml:
000000
成功
现在需要一个简单的处理:如果返回的code为"000000"则在前面加"00"。否则加"10"。利用正则中的(?=exp)和(?<=exp)可以很容易解决:
- (?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。
- (?<=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp。
Java中String类的replaceAll方法也可以使用正则表达式。
protected String transferErrorCode2(String response) { String patternStr = "(?<=)\\d+(?=
)"; Pattern pattern = Pattern.compile(patternStr); Matcher matcher = pattern.matcher(response); if (matcher.find()) { String match = matcher.group(0); String replace = (match.equals("000000") ? "00" : "10") + match; return response.replaceAll(patternStr, replace); } else { return response; } }
2、解析类似如下html片段中的车牌号:
车牌号码:京NC4Y59\t\t\t\t\t
java中用下面的正则表达式可以处理:
(?<=车牌号码:)\\S+(?=\\s)
同样用的是零宽断言,不过需要注意的是,这里用\\S+来匹配任意非空白字符,包括汉字。我刚开始想到的是用.来匹配:
(?<=车牌号码:).+(?=\\s)
得到的确实类似下面的结果:
京NC4Y59
这里“.”可以这样理解:“后面所有跟着空白字符(\\s)的字符”。
待补充……