首页 > 解决方案 > 无法匹配除 ' 和 " 之外的任何字符的正则表达式

问题描述

我写了一个正则表达式来匹配字符串

{{AB.group.one}}:"eighth",{{AB.group.TWO}}:"third",{{attr1111}}:"fourth","fifth":{{attr_22_2qq2}},"sixth":{{AB.group.three}},{{ab.group.fourth}}:"seventh","ninth":{{attr1111}}}

正则表达式:

/[^'"]({{2}[a-zA-Z0-9$_].*?}{2})[^'"]/gi

打破上面的正则表达式:

下面的匹配不是完全匹配,而是捕获的组。我将对捕获的组执行我的操作,因此为简单起见,我们可以将它们视为我们的匹配项。

预期匹配:

结果匹配:

如下图所示{{AB.group.one}}{{ab.group.fourth}}不匹配。我希望它们也能匹配它们。

正则表达式

我知道他们不匹配的原因。

{{AB.group.one}}不匹配的原因是因为[^'"]需要一个字符,除了'and"而我没有提供一个。如果我替换[^'"]["'"]*,它会起作用,但在这种情况下"{{AB.group.one}}"也会匹配。

因此,问题陈述是匹配前后的任何字符(如果有的话){{}}但字符不能是'or"

{{ab.group.fourth}}不匹配的原因是因为这个匹配之前的字符,是另一个匹配的一部分。这只是我的猜测,原因可能是别的。{{AB.group.three}},但是,如果我在和{{ab.group.fourth}}(例如)之间包含任何字符{{AB.group.three}}, {{ab.group.fourth}},则模式匹配。我不知道如何解决这个问题。

请帮我解决这两个问题。谢谢你。

标签: javascriptregex

解决方案


这是一种似乎有效的基于正则表达式的方法。首先,我们可以将所有双引号术语串起来,然后用一个逗号分隔符替换逗号/冒号岛。最后,以逗号分隔以生成术语数组。

var input = "{{AB.group.one}}:\"eighth\",{{AB.group.TWO}}:\"third\",{{attr1111}}:\"fourth\",\"fifth\":{{attr_22_2qq2}},\"sixth\":{{AB.group.three}},{{ab.group.fourth}}:\"seventh\",\"ninth\":{{attr1111}}},\"blah\":\"stuff\",{{one}}:{{two}}";
var terms = input.replace(/\".*?\"/g, "").replace(/[,:]+/g, ",").split(",");
console.log(terms);


推荐阅读