除了捕获组中的内容外,删除所有空格

5

正则表达式方言: JavaScript

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

例如匹配以下内容...

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

然而,我现在希望从一个字符串中删除所有空格,除了与此模式匹配的任何内容。也许有一种方法可以回溯引用捕获组\1,然后将其从匹配中排除吗?

我尝试过使用我的有限正则表达式知识来实现这一点,但到目前为止,我只能选择紧接着或在模式之后的空格。

我已经将我的测试脚本保存在regexr上,以方便您玩弄我的示例。

预期结果

key : string 变成 key:string

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

"Hello World" something here "Another String"

变成

"Hello World"somethinghere"Another String"

等等...


@anubhava:我不同意重复投票 - 接受的答案使用了一种仅适用于该问题中特殊字符串结构的策略,而您(更好的)答案在转义引号时失败。投票以重新打开。 - Tim Pietzcker
@TimPietzcker:好的,我相信一定有更好的重复内容,但我只是在搜索时找不到。 - anubhava
2
@SnareChops:你的正则表达式试图考虑转义引号,但它做得不正确(你的字符类是错误的,即使它起作用,你也应该考虑情况'foo \\',其中有一个反斜杠在闭合引号之前,但它不是一个转义反斜杠。你需要处理这样的情况吗? - Tim Pietzcker
2个回答

2

使用正则表达式非常难做到这一点。以下方法有效:

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

我从我之前回答类似问题的答案中构建了这个答案;因此我会引导你去那里查看解释。

您可以在regex101.com上实时测试


0
在Javascript中,您可以使用String.replace并将function as parameter作为参数。因此,您可以定义匹配组,然后可以单独替换每个匹配组。
您想匹配所有空格
\s+

而且你需要匹配所有引号内的内容

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

所以你把它们组合在一起

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

你可以使用匿名函数作为参数编写替换语句:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接