我有如下回复
<adm:TargetCode key="urn:comcast:altcon:activityState">INACTIVE</adm:TargetCode>
<adm:TargetCode key="urn:comcast:altcon:activityState">ACTIVE</adm:TargetCode>
使用正则表达式从中获取字符串INACTIVE
和ACTIVE
字符串。
我可以使用拆分方法,但是其中包含很多代码。为了减少代码,我更喜欢使用正则表达式。但是我该如何进行正则表达式?
答案 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
以外的任何字符。
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] +性能更好。