2

我想在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

4

3 回答 3

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);
于 2013-07-22T14:13:05.703 回答
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 个不同的组

  • 带有结束标记 <a blah>blah</a> 的 HTML 标记
  • 一个没有结束标签的 HTML 标签 <script src="blah" />
  • 一段没有空格的文本

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

于 2013-07-22T14:53:17.443 回答
0

试试这个...演示

(?<=</(a)>)|(?=<(a)>)
于 2013-07-22T14:19:12.833 回答