替换除HTML标记之外的所有空格

时间:2014-06-17 05:17:50

标签: java regex string

我需要用字符串中的html代码替换所有空格,即&amp; nbsp。目前正在进行替换,但它也用html标签替换空格,如<a href="http://google.com" />

string.replaceAll(" ", "&nbsp")

但我需要它不要更改标签。

示例:

String s1 = "Hello!, Check out this <^a href=\"http://www.entrepreneur.com/article/234538\">10 Movies Every Entrepreneur Needs to Watch <^/a>"

更换后,它应该是;

String s1 = "Hello!,&nbspCheck&nbspout&nbspthis&nbsp<^a href=\"http://www.entrepreneur.com/article/234538\">10&nbspMovies&nbspEvery&nbspEntrepreneur&nbspNeeds&nbspto&nbspWatch&nbsp<^/a>"

任何人都可以提出更智能的正则表达式来完成任务吗?

2 个答案:

答案 0 :(得分:3)

我知道你已经接受了答案,但你的问题有另一个没有提及的简单解决方案。这种情况听起来与"regex-match a pattern, excluding..."

的这个问题非常相似

关于使用正则表达式解析html的所有免责声明,这是一种简单的方法。

我们可以通过一个非常简单的正则表达式解决它:

<[^<>]*>|( )

交替|的左侧匹配完成<tags>。我们将忽略这些匹配。右侧匹配并捕获第1组的空格,我们知道它们是正确的空格,因为它们与左侧的表达式不匹配。

这个完整的Java程序展示了如何使用正则表达式(参见online demo底部的结果):

import java.util.*;
import java.io.*;
import java.util.regex.*;
import java.util.List;

class Program {
public static void main (String[] args) throws java.lang.Exception  {

String subject = "Hello!, Check out this <^a href=\"http://www.entrepreneur.com/article/234538\">10 Movies Every Entrepreneur Needs to Watch <^/a>";
Pattern regex = Pattern.compile("<[^<>]*>|( )");
Matcher m = regex.matcher(subject);
StringBuffer b= new StringBuffer();
while (m.find()) {
    if(m.group(1) != null) m.appendReplacement(b, "&nbsp;");
    else m.appendReplacement(b, m.group(0));
}
m.appendTail(b);
String replaced = b.toString();
System.out.println(replaced);
} // end main
} // end Program

参考

答案 1 :(得分:2)

如果我们可以假设字符串中><的唯一用途是标记,则此正则表达式将起作用:

 (?![^<]*>)

It works for your example.

工作原理:

  • 匹配空格字符。这和你的做法完全一样。
  • (?!开始出现负面预测。这意味着只有当前导符后面没有与前瞻中的正则表达式匹配的内容时,此正则表达式才会匹配。
  • [^<]*匹配任何非<,多次
  • 的字符
  • >匹配>
  • )关闭了前瞻。

换句话说,此正则表达式匹配任何空格,但根据要求,在空格后的每<之前必须有>