是否可以将这两个正则表达式结合起来或改进我的代码?

时间:2013-07-27 23:40:05

标签: javascript regex

我想知道是否有办法将下面的两个正则表达式组合在一起,或者用另一种方式组合我的两个任务。

1) /(<\/[a-z]>|<[a-z]*>)/g
2) /\s{2,}/g

具体来说,它们被用来取代它:

This is <b>a test</b> and this <i> is also a test</i>

进入这个:

This is <b> a test </b> and this <i> is also a test </i>

第一个正则表达式用于在每个开始和结束标记之前和之后添加空格,第二个正则表达式用于匹配要删除的两个或多个空格字符的每个出现。

这是代码

var inputString = 'This is <b>a test</b> and this <i> is also a test</i>',
    spacedTags = inputString.replace(/(<\/[a-z]>|<[a-z]*>)/g, ' $1 '),
    sanitizedSting = spacedTags.replace(/\s{2,}/g, ' ')

console.log(sanitizedSting);

jsfiddle

我知道可以使用DOM操作来完成这些操作,这可能会更快,但我正在尝试避免这种

谢谢

2 个答案:

答案 0 :(得分:3)

如果您查找尾随和前面的空格,则使用内部捕获组作为替换值,您可以实现类似的操作。

var inputString = 'This is <b>a test</b> and this <i> is also a test</i>',
    spacedTags = inputString.replace(/(\s*(<\/[a-z]>|<[a-z]*>)\s*)/g, ' $2 '); 

console.log(spacedTags);

JS Fiddle

这会查找匹配开头或结尾标记的任何内容,可选择用空格包围。然后使用内部匹配作为替换,并在任一侧添加空格。

但是,这两种实现都会在任何结束标记之后留下尾随空格。 "</i> "

我还没有从中看到性能变化,但它试图解决一个正则表达式的问题。

答案 1 :(得分:1)

你的问题是你可以添加一个空间吗?在这种情况下,请丢弃标记之前和之后的所有空格:

sanitizedSting = inputString.replace(/\s*(<\/?[a-z]*>)\s*/g, ' $1 ');

如果您以标签结尾,这也会在末尾添加一个空格(坦率地说,这个确切的代码存在其他问题)。