我有如下的回复
<adm:TargetCode key="urn:comcast:altcon:activityState">INACTIVE</adm:TargetCode>
<adm:TargetCode key="urn:comcast:altcon:activityState">ACTIVE</adm:TargetCode>
从这个使用正则表达式我怎么能得到字符串INACTIVE
和ACTIVE
字符串。
我可以使用split方法,但它包含大量代码。为了减少代码,我更喜欢用户正则表达式。但我怎样才能继续使用正则表达式?
使用正则表达式,您可以使用:
Pattern p1 = Pattern.compile(">(.*)<");
Matcher m1 = p1.matcher("<adm:TargetCode key=\"urn:comcast:altcon:activityState\">INACTIVE</adm:TargetCode>");
while (m1.find()) {
System.out.println(m1.group(1));
}
哪个输出:
INACTIVE
可以找到正则表达式的解释here。
使用字符串可以通过以下方式实现:
String input = "<adm:TargetCode key=\"urn:comcast:altcon:activityState\">INACTIVE</adm:TargetCode>";
input = input.substring(input.indexOf(">") + 1, input.lastIndexOf("<"));
您要解析的内容看起来像html,您应该更喜欢使用html解析器而不是正则表达式。
您可以使用JSoup轻松解析数据,如下所示:
String s = "<adm:TargetCode key=\"urn:comcast:altcon:activityState\">INACTIVE</adm:TargetCode>\r\n" +
"<adm:TargetCode key=\"urn:comcast:altcon:activityState\">ACTIVE</adm:TargetCode>";
Document doc = Jsoup.parse(s);
for (Element element : doc.getElementsByTag("adm:TargetCode")) {
System.out.println(element.text());
}
打印,
INACTIVE
ACTIVE
虽然有时候,可以使用正则表达式,以防您尝试解析的数据中没有嵌套结构。对于这种情况,你可以使用这个正则表达式,
(?<=>)[^><\n]+(?=<)
在这里,(?<=>)
positive look behind确保匹配的文本前面有>
和(?=<)
正向前看确保文本匹配后跟<
,而这个字符集[^><\n]+
捕获除>
<
和\n
之外的任何字符一次或多次。
Java代码,
String s = "<adm:TargetCode key=\"urn:comcast:altcon:activityState\">INACTIVE</adm:TargetCode>\n<adm:TargetCode key=\"urn:comcast:altcon:activityState\">ACTIVE</adm:TargetCode>";
Pattern p = Pattern.compile("(?<=>)[^><\\n]+(?=<)");
Matcher m = p.matcher(s);
while (m.find()) {
System.out.println(m.group());
}
打印标签中的值,
INACTIVE
ACTIVE
此外,其他答案的问题是,它在.*
中使用>(.*)<
,因此,在匹配>
之后,它贪婪地匹配任何字符,包括<
或任何出现在它中间的任何字符,只要它能在某处找到一个<
(最后出现在那里)并给出意想不到的匹配。要解决这个问题,它应该使用非贪婪的版本.*?
而不是.*
,但更好的是使用否定的字符类[^>