用于漂亮格式化用户文本的Javascript正则表达式

时间:2010-10-31 02:03:10

标签: javascript regex replace

我在这里做研究,为您找到格式化用户短信的最佳方式。

我想要实现的样本:

1)用户发送此消息:

   Doctor,
I would   like to    have
an appointment tomorrow morning.Please,call me! 

2)我的应用程序格式化此文本输出:

Doctor, I would like to have an appointment tomorrow morning. Please, call me!

请注意:

  • 尾随和前导空格必须消失(类似于使用$.trim()
  • 两个单词之间的额外空格必须用一个空格替换
  • 新行,符号行,标签<br>必须替换为一个空格
  • 点和逗号必须与下一个单词分开(morning.Please,call-&gt; morning。请致电)

到目前为止我得到了一些东西:

 text.replace(/<(.|\n\r)*?>/g, '')
 .replace(/\s/g,' ')
 .replace(/<br>/g,' ')
 .replace(/ +/g,' ');

将所有表达式合并为一个模式会很好。 有没有更短的方法呢?

4 个答案:

答案 0 :(得分:1)

在两个正则表达式中{jsFiddle demo):

text.replace(/\s+|([.,])(?=\S)/g, '$1 ').replace(/^\s|\s$/g, '')

将其分解,它匹配:

  • 一个或多个空白字符(换行符,制表符,空格)
  • 后跟非空格字符的句号或逗号(我们使用(?=正向前瞻)

并将其替换为单个空格(ASCII 32),在任何匹配的句点或逗号中保留为$ 1。然后在第二个正则表达式中剥离任何前导或尾随空白字符。第二个正则表达式是必要的,因为为原始字符串添加空格的正则表达式必须在替换子字符串中有空格,并且我们希望在开头或结尾处有 no 空格。

如果<br>很重要,那么在使用上述正则表达式(.replace(/<br>/g, ' '))之前最好将其替换为空格字符,但如果你真的想在同一个正则表达式中这样做: jsFiddle demo

text.replace(/(?:<br>|\s)+|([.,])(?=\S)(?!<br>)/g, '$1 ').replace(/^\s|\s$/g, '')

答案 1 :(得分:0)

没有测试过,但我相信这是等效的:

text.replace(/^\s+|\s+$/g, '')
    .replace(/\s+|\s*<br>\s*/g,' ')

修改

我不明白为什么第一个表达式替换了<>所以我把它排除了。

答案 2 :(得分:0)

也许,但我不确定进一步减少它的好处。正则表达式已经有点难以阅读,因此在以后进行调试时,逻辑分解会非常有用。

答案 3 :(得分:0)

text.replace(/\s/g,' ')用空格替换任何空格,换行符,垂直制表符,常规制表符和空格

.replace(/<\s*br\s*\/*\s*>/g,' ')用空格替换任何<br>, < br/ >, <br /> <br /> <br //>(等)

.replace(/\s{2,}/g,' ')用一个空格替换任何双倍或更多空格

.replace(/^\s|\s$/,'') ltrim + rtrim(虽然因为交替,性能明智,根据字符串大小分割成单独的ltrim和rtrims可能更好)

<强>最终

text = text.replace(/\s/g,' ').replace(/<\s*br\s*\/*\s*>/g,' ').replace(/\s{2,}/g,' ').replace(/^\s|\s$/,'');

你不能真正做到“一种模式”,因为前两种中的任何一种都有可能在完成后连续留下两个空格,所以你需要总是有最后一个句子。