我有这个字符串
<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文档中。
答案 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。
现在,你可以看到有两组:
(<h1\s+)
- <h1
+一个或多个空格([^<]*?>)
- 除<
以外的零个或多个字符,尽可能少,直到第一个>
字符。您只需要在第二次捕获中删除值和属性名称之间的空格,因此,请使用
/(\w+='')\s+/g
并替换为$1
(对回调中使用\w+=''
)捕获的值的反向引用。回调接受第一个参数作为整个匹配,然后接受所有捕获的子文件(您还可以添加偏移量和输入参数,请参阅Specifying a function as a parameter
)。
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;
注意有两个结果变量:ES6和ES5语法。 ES6使用arrow function而不是使用function
声明的匿名方法。一些较旧的浏览器可能不喜欢箭头功能,IE和Safari目前不支持它们。