你可以使用这个:
/\benv: (["'])([^"']*)\1/g
哪里\1
是对第一个捕获组的反向引用,因此您的内容在第二个。这是简单案例的简单方法。
现在,其他情况如:
env: "abc\"def"
env: "abc\\"
env: "abc\\\def"
env: "abc'def"
您必须使用更具约束力的模式:
第一:避免不同的引号问题:
/\benv: (["'])((?:[^"']+|(?!\1)["'])*)\1/g
我将所有可能的内容放在一个我可以随意重复的非捕获组中,并且我使用否定前瞻(?!\1)
来检查允许的引用是否与捕获的引用不同。
第二:反斜杠问题:
如果引号被转义,则不能是结束引号!因此,您必须检查引号是否被转义并允许字符串中的转义引号。
我从允许的内容中删除了反斜杠:
/\benv: (["'])((?:[^"'\\]+|(?!\1)["'])*)\1/g
我允许转义字符:
/\benv: (["'])((?:[^"'\\]+|(?!\1)["']|\\[\s\S])*)\1/g
要在引用部分之前允许可变数量的空格,您可以替换:
为:\s*
/\benv:\s*(["'])((?:[^"'\\]+|(?!\1)["']|\\[\s\S])*)\1/g
你现在有一个工作模式。
第三:模式优化
一个简单的替代:
使用捕获组和反向引用可能会吸引处理不同类型的引号,因为它允许以简洁的方式编写模式。但是这种方式需要创建一个捕获组并在这部分(?!\1)
["']`中测试一个lookahead,所以效率不高。编写一个简单的alternation会增加pattern长度,并且需要为这两种情况使用两个捕获组但更有效:
/\benv:\s*(?:"((?:[^"\\]+|\\[\s\S])*)"|'((?:[^'\\]+|\\[\s\S])*)')/g
(注意:如果您决定这样做,则必须检查定义了两个捕获组中的哪一个。)
展开循环:
为了匹配我们使用的引号内的内容(?:[^"\\]+|\\[\s\S])*
(此处为双引号),它可以工作但可以改进以减少所需的步骤量。为此,我们将展开包含避免交替的循环:
[^"\\]*(?:\\[\s\S][^"\\]*)*
最后整个模式可以这样写:
/\benv:\s*(?:"([^"\\]*(?:\\[\s\S][^"\\]*)*)"|'([^'\\]*(?:\\[\s\S][^'\\]*)*)')/g