正则表达式从响应中获取特定的字符串

时间:2019-04-20 06:25:09

标签: java regex

我有如下回复

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

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

使用正则表达式从中获取字符串INACTIVEACTIVE字符串。

我可以使用拆分方法,但是其中包含很多代码。为了减少代码,我更喜欢使用正则表达式。但是我该如何进行正则表达式?

2 个答案:

答案 0 :(得分:1)

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

def new_list(request):
    form = ItemForm(data=request.POST)
    if form.is_valid():
        list_ = List()
        list_.owner = request.user
        list_.save()
        form.save(for_list=list_)
        return redirect(str(list_.get_absolute_url()))
    else:
        return render(request, 'home.html', {"form": form})

哪个输出:

  

无效

可以找到here对正则表达式的解释。


使用字符串可以通过以下方式实现:

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));
}

答案 1 :(得分: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

另外,其他答案的问题是,它在.*中使用>(.*)<,因此,在匹配>之后,它贪婪地匹配包括<在内的任何字符或只要它可以在行的某处找到<(位于末尾)并给出意外的匹配,它就会出现在中间。要解决此问题,它应该使用非贪婪版本.*?而不是.*,但更好的方法是使用否定的字符类[^> <\ n] +性能更好。