【问题标题】:Java match a single word, that may or may not be separated by spacesJava 匹配一个单词,可以用空格分隔,也可以不用空格分隔
【发布时间】:2016-04-22 09:57:50
【问题描述】:

我想编写一个读取以下输入的程序:

<repeat value="2" content="helloworld"/>

现在我需要在不同的变量中解析和存储“repeat”、“2”和“helloword”。到目前为止,一切都很好。问题是输入中的任何地方都可能有空格,这使得任务变得更加困难并且超出了我的能力范围。我想也许可以使用正则表达式,但我无法得到一个工作,我对该主题的研究没有产生任何结果。那么有什么聪明的方法可以做到这一点呢?

例子:

< rep eat va lue=" 2"    conte nt= "helloworld"/>

去马赫

repeat, 2, helloworld

【问题讨论】:

  • 这个? (?&lt;=&lt;)(\w+)|\w+="(\w+)", DEMO
  • 您到底想检索什么?标签的名称和每个属性的值?您很可能会从使用 XML 解析器中受益。

标签: java regex parsing


【解决方案1】:

使用这个正则表达式覆盖所有可能的间距:

<\s*(\w+)\s+value\s*=\s*"(\w+)"\s*content\s*=\s*"(\w+)"\s*\/\s*>

这将匹配您作为示例提供的整个字符串,并返回标签(第 1 组)、值(第 2 组)和内容(第 3 组)。

Test it online at regex101.com


更新:

要在关键字valuecontent 中允许空格,您只需在每个字母之间添加\s*(匹配任意数量的空白字符,包括零):

<\s*(.+)\s+v\s*a\s*l\s*u\s*e\s*=\s*"(\w+)"\s*c\s*o\s*n\s*t\s*e\s*n\s*t\s*=\s*"(.+)"\s*\/\s*>

Test it online at regex101.com

【讨论】:

  • 感谢@ByteCommander,但我们可以更进一步 - 匹配我想要匹配的单词,即使其中有空格。编辑我的问题以获得更多说明。
  • @Alex 您可以在所有字母之间添加\s*。更新了我的答案。如果它解决了您的问题,也不要忘记接受它。
【解决方案2】:

我建议你使用 DOM 解析器,例如 Jsoup。 当然,输入应该是有效的xml/html

package com.example;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

public class AttributesReader {
    public static void main(String[] args) throws Exception {
        String xmlStrMessage="<repeat value=\"2\" content=\"helloworld\"/>";
        Document doc = Jsoup.parse(xmlStrMessage);
        Elements repeat = doc.select("repeat");
        System.out.println("value:"+repeat.attr("value"));
        System.out.println("content:"+repeat.attr("content"));
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 2012-07-28
    • 2015-03-31
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多