1

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

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

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

这就是我想说的:

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

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

谢谢

PS这里是一个#failed小提琴:http: //jsfiddle.net/DfHge/

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

4

3 回答 3

2

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

*意味着没有或更多

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

.*?是一个勉强的贪婪匹配所有

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

于 2013-07-31T19:56:49.730 回答
2

你可以使用这个:

/\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
于 2013-07-31T20:03:23.487 回答
1
regex=/env: ?['"]([^'"])+['"]/
answer=str.match(regex)[1]

更好:

regex=/env: ?(['"])([^\1]*)\1/
于 2013-07-31T19:55:58.980 回答