获取某些字符串之间的数组或字符串列表(搜索多个字符串)

时间:2015-04-17 08:28:48

标签: java regex string

我有一个字符串,其中包含一些XML。此XML包含如下输入:

<xyz1>...</xyz1>
<hello>text between strings #1</hello>
<xyz2>...</xyz2>
<hello>text between strings #2</hello>
<xyz3>...</xyz3>

我希望得到所有这些<hello>text between strings</hello>

所以最后我想要一个包含所有<hello>...</hello>

的List或任何Collection

我尝试使用Regex和Matcher,但问题是它不适用于大字符串....如果我尝试使用较小的字符串,它可以工作。我读了一篇关于这个的博客文章,这说明Java Regex因大字符串的交替而被破坏。

有没有简单易行的方法呢?

修改

尝试是......

String pattern1 = "<hello>";
String pattern2 = "</hello>";
List<String> helloList = new ArrayList<String>();

String regexString = Pattern.quote(pattern1) + "(.*?)" + Pattern.quote(pattern2);


Pattern pattern = Pattern.compile(regexString);

Matcher matcher = pattern.matcher(scannerString);
while (matcher.find()) {
  String textInBetween = matcher.group(1); // Since (.*?) is capturing group 1
  // You can insert match into a List/Collection here
  helloList.add(textInBetween);
  logger.info("-------------->>>> " + textInBetween);
}

4 个答案:

答案 0 :(得分:1)

您必须使用xml解析器解析xml。它比使用正则表达式更容易。

DOM解析器是最简单的使用,但如果您的xml非常大,请使用SAX解析器

答案 1 :(得分:1)

我强烈建议使用多种可用的公共XML解析器之一:

实现您想要实现的目标会更容易(即使您希望将来详细说明您的要求)。如果您对速度和内存没有任何问题,请继续使用 dom4j 。如果您希望我在这个答案中发布好的示例,那么在线有大量的资源,因为我现在的答案只是重定向您的替代选项,但我不确定您的限制是什么。


关于解析XML时的REGEX,Dour High Arch给出了很好的回复:

  

XML不是常规语言。您无法使用正则表达式解析它。当你获得嵌套标签时,你认为可以使用的表达式会破坏,然后当你修复它时会破坏XML注释,然后是CDATA部分,然后是处理器指令,然后命名空间,......它无法工作,使用XML解析器。 / p>

Parsing XML with REGEX in Java

答案 2 :(得分:1)

如果您必须解析XML文件,我建议您使用XPath语言。所以你必须基本上做这些行动:

  1. 解析DOM对象中的XML String
  2. 创建XPath查询
  3. 查询DOM
  4. 尝试查看this link

    您必须做的一个例子是:

    String xml = ...;
    try {
       // Build structures to parse the String
       DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
       // Parse the XML string into a DOM object
       Document document= builder.parse(new ByteArrayInputStream(xml.getBytes()));
       // Create an XPath query
       XPath xPath =  XPathFactory.newInstance().newXPath();
       // Query the DOM object with the query '//hello'
       NodeList nodeList = (NodeList) xPath.compile("//hello").evaluate(document, XPathConstants.NODESET);
    } catch (Exception e) {
       e.printStackTrace();
    }
    

答案 3 :(得分:0)

使用Java 8,您可以使用Dynamics库以直接的方式执行此操作

XmlDynamic xml = new XmlDynamic(
    "<bunch_of_data>" +
        "<xyz1>...</xyz1>" +
        "<hello>text between strings #1</hello>" +
        "<xyz2>...</xyz2>" +
        "<hello>text between strings #2</hello>" +
        "<xyz3>...</xyz3>" +
    "</bunch_of_data>");

List<String> hellos = xml.get("bunch_of_data").children()
    .filter(XmlDynamic.hasElementName("hello"))
    .map(hello -> hello.asString())
    .collect(Collectors.toList()); // ["text between strings #1", "text between strings #2"]

请参阅https://github.com/alexheretic/dynamics#xml-dynamics