删除除捕获组中包含的空白之外的所有空白

Remove all whitespace EXCEPT what is contained in the capture group

本文关键字:空白 包含 删除      更新时间:2023-09-26

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"

等等。。。

这对于正则表达式来说是非常困难的。以下工作:

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

我根据我之前对一个类似但不完全相同的问题的回答构建了这个答案;因此,我将请你去解释一下。

您可以在regex101.com上对其进行实时测试。

在Javascript中,可以使用带有函数的String.replace作为参数。因此,您可以定义匹配的组,然后可以分别替换每个组。

您想要匹配所有空白

's+

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

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

所以你把它组合在一起

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

然后用匿名函数作为参数编写replace语句

var filteredString = notFilteredString.replace(pattern,
        function(match, group1) { return group1 || "" })

每次匹配时,都会调用函数来提供替换字符串。正则表达式匹配空格或引号内容。引号的内容被包装为group1,如果group1匹配或空白或任何其他匹配的""不匹配,则匿名函数返回group1