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

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操作来完成这些操作,这可能会更快,但是我正努力避免这种情况。

谢谢

最佳答案

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

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> "

我还没有考虑过由此带来的性能变化,但是它试图解决一个正则表达式的问题。

07-24 17:32