获取两个标记之间的字符串值

时间:2016-05-09 17:27:28

标签: java regex

我是一个相当新的正则表达式,但我正在努力学习它。我没有做任何复杂的事情;我有一些XML:

<root>
   <friendlyName>Hello, I'm friendly</friendlyName>
   <URL>http://localhost</URL>
</root>

我正在尝试获取friendlyName的值,但它似乎不起作用。我使用了来自https://regex101.com/的在线正则表达式测试器,它似乎与我期望的相匹配。但是,当我在Java中尝试时,我会返回N/AN/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

3 个答案:

答案 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" ;
}
希望这可以提供帮助。