正则表达式从响应中获取特定字符串[关闭]

问题描述 投票:0回答:2

我有如下的回复

<adm:TargetCode key="urn:comcast:altcon:activityState">INACTIVE</adm:TargetCode>

  <adm:TargetCode key="urn:comcast:altcon:activityState">ACTIVE</adm:TargetCode>

从这个使用正则表达式我怎么能得到字符串INACTIVEACTIVE字符串。

我可以使用split方法,但它包含大量代码。为了减少代码,我更喜欢用户正则表达式。但我怎样才能继续使用正则表达式?

java regex
2个回答
1
投票

使用正则表达式,您可以使用:

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("<"));

1
投票

您要解析的内容看起来像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之外的任何字符一次或多次。

Regex Demo

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

此外,其他答案的问题是,它在.*中使用>(.*)<,因此,在匹配>之后,它贪婪地匹配任何字符,包括<或任何出现在它中间的任何字符,只要它能在某处找到一个<(最后出现在那里)并给出意想不到的匹配。要解决这个问题,它应该使用非贪婪的版本.*?而不是.*,但更好的是使用否定的字符类[^>

© www.soinside.com 2019 - 2024. All rights reserved.