删除所有空格,除非空格是精确字符串的一部分

时间:2016-09-05 20:47:58

标签: javascript regex

我有这个字符串

<h1 class='' id='' title=''></h1>

我想删除除h1之后的空格以外的所有空格,以便输出看起来像那样

<h1 class=''id=''title=''></h1>

我试过两次

var string = "<h1 class='' id='' title=''></h1>";
var regexp = /\s/g;
var regexp2 = /(<h1)/g;
var string = string.replace(regexp, "").replace(regexp2, "$1 ");
console.log(string);

我想知道是否有办法将这两个正则表达式合二为一。 我试着做

var string = "<h1 class='' id='' title=''></h1>";
var regexp = /(?!<h1)\s/g;
var string = string.replace(regexp, "");
console.log(string);

不幸的是,它并没有这样做。我想要一个解释的答案,如何删除我的字符串中的所有空格,除了<h1中的空格,知道这是众多h1行中的一个,我还想删除所有\n\t,这就是我在正则表达式中使用\s的原因。

为什么问题,我只想删除里面&lt; ...&gt;每个选择器之后的所有空格,但不是像h1这样的标记名之后的空格,只是为了我自己的好奇心和练习正则表达式。还有所有返回和标签字符。在HTML5文档中。

2 个答案:

答案 0 :(得分:3)

(\w+='')\替换$1,请参阅a demo on regex101.com 完整的JS代码:

var string = "<h1 class='' id='' title=''></h1>";
var regexp = /(\w+='')\ /g;
var string = string.replace(regexp, "$1");
alert(string);

请参阅a demo on jsfiddle.net 正如@Redu所指出的,您可以将其更改为(\w+='')\s+多个连续的空格。

<小时/> 问题仍然存在:为什么?

答案 1 :(得分:1)

这里的要点是你要匹配一个文本块,只在一个子部分内部删除全局内容。使用正则表达式,通常可以通过匹配整个块来实现这一点,同时使用捕获组(配对(...))捕获不同的较小子部分,并且在replace方法内使用回调匿名接受所有这些(实际上是更多)组的方法。

这是一个匹配&#39;块的正则表达式:

/(<h1\s+)([^<]*?>)/g

请参阅regex demo

现在,你可以看到有两组:

  • 1)(<h1\s+) - <h1 +一个或多个空格
  • 2)([^<]*?>) - 除<以外的零个或多个字符,尽可能少,直到第一个>字符。

您只需要在第二次捕获中删除值和属性名称之间的空格,因此,请使用

/(\w+='')\s+/g

并替换为$1(对回调中使用\w+=''捕获的值的反向引用。回调接受第一个参数作为整个匹配,然后接受所有捕获的子文件(您还可以添加偏移量和输入参数,请参阅Specifying a function as a parameter)。

&#13;
&#13;
var s = `<h1 class='' id='' title=''>Title1</h1>
<h1 class='' id='' title=''>Title2</h1>`;
var res_es6 = s.replace(/(<h1\s+)([^<]*?>)/g, (m,grp1,grp2)=>grp1+grp2.replace(/(\w+='')\s+/g, '$1'));
var res_es5 = s.replace(/(<h1\s+)([^<]*?>)/g, 
   function(m,grp1,grp2) { 
       return grp1+grp2.replace(/(\w+='')\s+/g, '$1');
   }
);
console.log(res_es6);
console.log(res_es5);
&#13;
&#13;
&#13;

注意有两个结果变量:ES6和ES5语法。 ES6使用arrow function而不是使用function声明的匿名方法。一些较旧的浏览器可能不喜欢箭头功能,IE和Safari目前不支持它们。