Java正则表达式什么都不匹配

时间:2015-04-23 06:32:11

标签: java regex

String string = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
            "<Request>\n" +
            "  <Item>\n" +
            "    <Type>C0401</Type>\n" +
            "    <InvDate>20150301</InvDate>\n" +
            "    <No>PK1000000</No>\n" +
            "  </Item>\n" +
            "  <Item>\n" +
            "    <Type>C0401</Type>\n" +
            "    <InvDate>20150301</InvDate>\n" +
            "    <No>PK1000002</No>\n" +
            "  </Item>\n" +
            "</Request>";
    Pattern pattern = Pattern.compile("(<Item>)(.*)(</Item>)");
    Matcher matcher = pattern.matcher(string);

    List<String> listMatches = new ArrayList<String>();

    while(matcher.find())
    {
        listMatches.add(matcher.group(2));
    }

如果我将项目替换为TypeInvDateNo,我可以获取内容。

寻找答案。感谢

3 个答案:

答案 0 :(得分:0)

您需要使用DOTALL标记使DOT匹配任何字符,包括换行符:

Pattern pattern = Pattern.compile("(?s)(<Item>)(.*)(</Item>)");

否则:

Pattern pattern = Pattern.compile("(<Item>)(.*)(</Item>)", Pattern.DOTALL);

答案 1 :(得分:0)

您必须为多行匹配使用选项Pattern.DOTALL

 Pattern pattern = Pattern.compile("(<Item>)(.*)(</Item>)",Pattern.DOTALL);

但最好使用HTML解析器。

答案 2 :(得分:0)

您必须为多行匹配使用 Pattern.DOTALL 选项:

Pattern pattern = Pattern.compile("(<Item>)(.*?)(</Item>)",Pattern.DOTALL);

量词:*?在零和无限次之间,尽可能少的时间,根据需要扩展[懒惰]