正则表达式方言: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"
等...
答案 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.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
,或者对于空格或任何其他匹配,匿名函数返回""
。