繁体   English   中英

使用JS匹配简单的正则表达式模式(键:值)

[英]Match simple regex pattern using JS (key: value)

我有一个简单的场景,我想匹配以下内容并捕获值:

stuff_in_string,
env: 'local', // want to match this and capture the content in quotes
more_stuff_in_string

我以前从未写过正则表达式模式,因此请原谅,我很清楚这是完全错误的。

这就是我要说的:

  • 匹配“ env:”
  • 后面没有空格
  • 后跟单引号或双引号
  • 捕获所有直到..
  • 下一个单引号或双引号

/env:*?\\s+('|")+(.*?)+('|")/g

谢谢

PS这里是#失败的小提琴: http : //jsfiddle.net/DfHge/

注意:这是我最终使用的正则表达式(不是下面的答案,因为它对我的需求来说是过大的): /env:\\s+(?:"|')(\\w+)(?:"|')/

env *('|").*?\\1是您要寻找的

*表示没有或更多

('|")匹配单引号或双引号, 也将其保存到组中以进行反向引用

.*? 是一个勉强的贪婪的比赛

\\1将引用第一组,即单引号或双引号

您可以使用此:

/\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) [“']`,因此效率不高。编写简单的替换会增加模式长度,并且需要使用两个捕获这两种情况下的组,但效率更高:

/\benv:\s*(?:"((?:[^"\\]+|\\[\s\S])*)"|'((?:[^'\\]+|\\[\s\S])*)')/g

(注意:如果您决定这样做,则必须检查是否定义了两个捕获组之一。)

展开循环:

为了匹配引号内的内容,我们使用(?:[^"\\\\]+|\\\\[\\s\\S])* (此处为双引号)有效,但可以进行改进以减少所需的步骤。为此,我们将展开循环以避免循环:

[^"\\]*(?:\\[\s\S][^"\\]*)*

最后,整个模式可以这样写:

/\benv:\s*(?:"([^"\\]*(?:\\[\s\S][^"\\]*)*)"|'([^'\\]*(?:\\[\s\S][^'\\]*)*)')/g
regex=/env: ?['"]([^'"])+['"]/
answer=str.match(regex)[1]

甚至更好:

regex=/env: ?(['"])([^\1]*)\1/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM