【问题标题】:Splitting up a string by what matches and does not match the regex通过匹配和不匹配正则表达式的内容拆分字符串
【发布时间】:2013-03-26 01:50:29
【问题描述】:

我目前有一个程序可以找到字符串中的所有正则表达式,但是对于不同的部分,我想要匹配正则表达式的部分和不匹配的部分。

因此,如果我有 <h1> hello world </h1>,我希望能够将其拆分为 [<h1>hello world</h1>]。

有没有人知道他们将如何解决这个问题?

这是我的代码,它拆分字符串以查找正则表达式部分

ArrayList<String> foundTags = new ArrayList<String>();
Pattern p = Pattern.compile("<(.*?)>");
Matcher m = p.matcher(HTMLLine);
while(m.find()){
    foundTags.add(m.group(0));
}

【问题讨论】:

  • @nattyddubbs 是的,通常我会同意你的看法,只是我已经有一个函数可以成功判断它是 html 还是文本。我正在寻找一种方法来每次找到与上面列出的标准匹配的正则表达式来拆分字符串。其中“

    hello world

    ” = [ h1, hello world, /h1]。如何判断其 html 是否已在另一部分代码中编写和测试的逻辑
  • 有效 html:&lt;h1&gt;&lt;&gt;。我只是说 Html 上的文本处理并不那么可靠。继续自担风险...
  • @leonbloy 我想到了这一点,但我不知道如何用正则表达式作为拆分器来编写它
  • @nattyddubbs 我同意你的看法,但我要解决的问题是给我文本格式的 HTML,我需要弄清楚如何正确解析它。一旦我找到文本或 HTML 标记,我就会将其创建为一个对象,以使其更易于使用。

标签: java regex string parsing arraylist


【解决方案1】:

For example:

String text = "testing<hi>bye</hi><b>bla bla!";
Pattern p = Pattern.compile("<(.*?)>");
Matcher m = p.matcher(text);
int last_match = 0;
List<String> splitted=new ArrayList<>();
while (m.find()) {
        splitted.add(text.substring(last_match,m.start()));
        splitted.add(m.group());
        last_match = m.end();
    }
    splitted.add(text.substring(last_match));
System.out.println(splitted.toString());

打印[testing, &lt;hi&gt;, bye, &lt;/hi&gt;, , &lt;b&gt;, bla bla!]

这就是你想要的吗?如果您不想要它们,您可以轻松地修复代码以省略空元素:

while (m.find()) {
    if(last_match != m.start())
        splitted.add(text.substring(last_match,m.start()));
    splitted.add(m.group());
    last_match = m.end();
}
if(last_match != text.length())
    splitted.add(text.substring(last_match));

请记住,正如 cmets 中所指出的:使用正则表达式解析任意 HTML/XML 通常是个坏主意。

【讨论】:

  • 是的,我知道它不是解析 HTML 的最佳方式,但它是必需的方式,如果给我一个无效标签,我有一个方法来检查每个标签。谢谢!
【解决方案2】:

您可以使用正则表达式分组功能来检索匹配的不同部分。例如:

ArrayList<String> list = new ArrayList<String>();
Pattern p = Pattern.compile("(<.*?>)(.*)(<.*?>)");
Matcher m = p.matcher("<h1> Hello World </h1>");
while(m.find()){
    list.add(m.group(1));
    list.add(m.group(2));
    list.add(m.group(3));
}

会给你你想要的列表:["&lt;h1&gt;", " Hello World ", "&lt;/h1&gt;"]。请注意,组号 0 是完全匹配的表达式。

【讨论】:

  • 有没有办法找到组数?
  • 我相信组的数量取决于您制作的组数。在正则表达式中,括号分隔组,因此在上面的表达式(&lt;.*?&gt;)(.*)(&lt;.*?&gt;) 中,有 3 组括号,因此 3 个组(如果计算整个表达式,则为 4 个)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2012-02-09
  • 1970-01-01
  • 2017-01-09
  • 2021-02-09
  • 2016-02-14
相关资源
最近更新 更多