1

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

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 操作来完成,这可能会更快,但我试图避免这种情况

谢谢

4

2 回答 2

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小提琴

这将查找与可选地被空格包围的开始或结束标记匹配的任何内容。然后它使用内部匹配作为替换,并在两侧添加空格。

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

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

于 2013-07-28T01:02:12.023 回答
1

你的问题是你可以在已经有一个空间的地方添加一个空间吗?在这种情况下,丢弃标签前后的所有空格:

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

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

于 2013-07-28T01:05:48.923 回答