删除所有空格除了捕获组中包含的内容

时间:2015-12-06 09:32:31

标签: javascript regex

正则表达式方言:JavaScript

我有以下捕获组(('|").*?[^\\\2]\2),用于选择不包含转义引号的带引号的字符串。

匹配这些例如......

"Felix's pet"
'Felix\'s pet'

但是,我现在想从字符串中删除所有空格,但符合此模式的任何内容。是否有一种方法可以支持引用捕获组\1,然后将其从匹配项中排除?

我试图用我有限的RegEx知识来做到这一点,但到目前为止,我只能选择紧接模式之前或之后的空间。

如果您想玩我的示例,我已将测试脚本保存在regexr上以方便使用。

预期结果

key : string变为key:string

dragon : "Felix's pet"变为dragon:"Felix's pet"

"Hello World" something here "Another String"

成为

"Hello World"somethinghere"Another String"

等...

2 个答案:

答案 0 :(得分:2)

这对正则表达式来说非常难。以下作品:

result = subject.replace(/ (?=(?:(?:\\.|"(?:\\.|[^"\\])*"|[^\\'"])*'(?:\\.|"(?:\\.|[^"'\\])*"|[^\\'])*')*(?:\\.|"(?:\\.|[^"\\])*"|[^\\'])*$)(?=(?:(?:\\.|'(?:\\.|[^'\\])*'|[^\\'"])*"(?:\\.|'(?:\\.|[^'"\\])*'|[^\\"])*")*(?:\\.|'(?:\\.|[^'\\])*'|[^\\"])*$)/g, "");

我已经从一个of my earlier answers to a similar, but not identical question建立了这个答案;因此,我会引用你的解释。

您可以对其进行测试live on regex101.com

答案 1 :(得分:0)

在Javascript中,您可以将String.replacefunction as parameter一起使用。因此,您定义匹配组,然后您可以单独替换它们。

您希望匹配所有空格

\s+

并且您需要匹配所有内部引号

(('|")(?:[^\\]\\\2|.)*?\2)

所以你把它们结合在一起

var pattern = /\s+|(('|")(?:[^\\]\\\2|.)*?\2)/g

并使用匿名函数作为参数

编写替换语句
var filteredString = notFilteredString.replace(pattern,
        function(match, group1) { return group1 || "" })

对于每个匹配,调用该函数以提供替换字符串。正则表达式匹配空格或引用内容。引用内容包装为group1,如果匹配group1则匿名函数返回group1,或者对于空格或任何其他匹配,匿名函数返回""