在空格处拆分句子但不在html标签中拆分

时间:2013-07-22 13:58:40

标签: java regex

我想在java中的空白处分开一个句子。但在文本中它们是html标签,我不想在这里拆分。 因此,例如"hello <a>John Smith</a> hey ho"应该拆分为:

hello
<a>John Smith</a>
hey
ho

我考虑过使用split并在javascript中找到一个正则表达式,但我无法将其转换为java 有没有更好的方法然后使用正则表达式拆分?

[编辑] 这是我可以转换的javascript正则表达式,但我想知道是否有比正则表达式更好的方法? https://stackoverflow.com/a/7552371/2170547

3 个答案:

答案 0 :(得分:3)

首先,我不建议正则表达式解析任何形式的HTML,但如果你坚持,这就是你要做的:

您必须首先匹配所有html标记,然后在空格上进行拆分。正则表达式更容易做出你想要做的事情的逆转。

以下是一个实例:http://regex101.com/r/wX5hI4

希望这有帮助。

编辑: 以下是从网站中提取的生成的java代码:

String re = "(<a>.*?</a>)\\s*| ";
String str = "hello <a>John Smith</a> hey ho";

Pattern p = Pattern.compile(re);
Matcher m = p.matcher(str);

答案 1 :(得分:1)

这是一些实际工作的Java7代码http://ideone.com/PWv56h

class Main
{
  public static void main (String[] args) throws java.lang.Exception
  {
     String test = "testing 1 2 3 <a title=\"a demo\" href=\"\">testing 4 5 6</a> testing\t7\n8\r9 <br /><script src=\"blah\" />more text";
     java.util.regex.Matcher m = java.util.regex.Pattern.compile("(<(?<tag>[A-Za-z]+)[^>]*?>[^<]*</\\k<tag>>)|(<[A-Za-z]+[^>]*?/>)|([^\\p{Space}]+)").matcher(test);
     while(m.find())
        System.out.println(m.group());
  }
}

正则表达式匹配3个不同的组

  • 带有结束标记&lt; a blah&gt; blah&lt; / a&gt;
  • 的HTML标记
  • 没有结束标记的HTML标记&lt; script src =“blah”/&gt;
  • 一段没有空格的文字

如果HTML正确且HTML实体正确转义,则上述正则表达式匹配器应该可以正常工作。即使在凌乱的HTML中,它也会快速而且相当准确。

答案 2 :(得分:0)

试试这个... DEMO

(?<=</(a)>)|(?=<(a)>)