我是一个相当新的正则表达式,但我正在努力学习它。我没有做任何复杂的事情;我有一些XML:
<root>
<friendlyName>Hello, I'm friendly</friendlyName>
<URL>http://localhost</URL>
</root>
我正在尝试获取friendlyName的值,但它似乎不起作用。我使用了来自https://regex101.com/
的在线正则表达式测试器,它似乎与我期望的相匹配。但是,当我在Java中尝试时,我会返回N/A
,N/A
是我找不到的字符串。
以下是我的代码:
public String getXMLTagValue(String tagName)
{
Pattern pattern = Pattern.compile("<" + tagName + ">(.*?)</" + tagName + ">/s");
Matcher matcher = pattern.matcher(xmlString);
while (matcher.find())
{
return matcher.group();
}
return "N/A";
}
我希望上面的代码返回Hello, I'm friendly
,但我得到N/A
。
答案 0 :(得分:0)
你的正则表达式被错误定义,它必须是:
"<" + tagName + ">(.*?)</" + tagName + ">\\s"
而不是
"<" + tagName + ">(.*?)</" + tagName + ">/s"
答案 1 :(得分:0)
更改
"<" + tagName + ">(.*?)</" + tagName + ">/s"
到
"<" + tagName + ">(.*?)</" + tagName + ">\\s"
原因:
\ s元字符用于查找空白字符 空白字符可以是:
空格字符
标签字符
回车符号
新行字符
垂直制表符字符
换页符号
所以真正的形式是\s
,当来到java正则表达式变成\\s
时(因为\
是java中的一个特殊字符)
此外,我(以及其他一些人)认为不必使用\\s
。你可以使用这种模式:
"<" + tagName + ">(.*?)</" + tagName + ">"
答案 2 :(得分:0)
开始更正您的XML <friendlyName> ends with </friendly>
,它的格式不正确。那么正则表达式是错误的,你可以替换:
"<" + tagName + ">(.*?)</" + tagName + ">/s"
使用:
"<" + tagName + ">(.*?)</" + tagName + ">\\s"
但实际上你不需要“\\ s”。
如果只想要标记之间的文本,则还需要在返回结果字符串之前删除open和close标记。 下面是工作代码,我还添加了一个改进的方法,使用javax.xml.parsers.DocumentBuilder来解析XML而不是正则表达式。
private static String xmlString =
"<root>"
+"<friendly>Hello, I'm friendly</friendly>"
+"<url>http://localhost</url>"
+"</root>";
public static void main(String[] args) throws Exception {
String value = getXMLTagValue("friendly");
System.out.println(value);
String out = getXMLTagValueImproved("friendly");
System.out.println(out);
}
public static String getXMLTagValue(String tagName)
{
String openTag = "<" + tagName + ">";
String closeTag = "</" + tagName + ">";
Pattern pattern = Pattern.compile(openTag + "(.*?)" + closeTag);
Matcher matcher = pattern.matcher(xmlString);
while (matcher.find())
{
return matcher.group().replaceAll(openTag, "").replace(closeTag, "");
}
return "N/A";
}
public static String getXMLTagValueImproved(String tagName) throws Exception {
InputSource is = new InputSource(new StringReader(xmlString));
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();;
Document doc = dBuilder.parse(is);
NodeList nl = doc.getDocumentElement().getElementsByTagName(tagName);
return nl.getLength() > 0 ? nl.item(0).getTextContent() : "N/A" ;
}
希望这可以提供帮助。