正则表达式 - 处理括号

时间:2011-04-08 15:54:27

标签: javascript regex

我在正则表达式方面做得越来越好,但我仍然遇到了一些问题......我正在尝试使用正则表达式从一组括号中提取一个值。我遇到的问题是这个集合前面有一个左括号。

以下是一些例子:

'x(1)'.match(/\((.+?)\)/)[1] // returns "1" as expected
'\)(1)'.match(/\((.+?)\)/)[1] // returns "1" as expected

括号前的字符可以是任何字符,包括另一个左括号

'\((1)'.match(/\((.+?)\)/)[1] // returns "(1", but I only want "1"

这只是字符串的一小部分,所以这部分已经拆分了。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:6)

当表达更精确时,切勿使用圆点。在这种情况下,您希望匹配最里面括号的内容。因此,内容是任何未打开或关闭括号的字符,如下所示:

/\(([^()]+)\)/

答案 1 :(得分:2)

基于该数据集,最简单的做法可能就是将量词添加到开放式数据集中,例如:

/\(+(.+?)\)/

通过这种方式,它可以匹配任何连续数量的开放量,导致你想要捕获的内容,但必须至少在匹配的下一部分之前有一个paren。这里的rubular示例。 注意:正如我在下面提到的那样,这将捕获分组中由其他字符分隔的开放式parens(ridgerider在下面的评论中提供了( (stuff))的示例,类似于例如(1(1)您的示例中没有明确说明这是否是所需的行为,但如果没有,请参阅下文。

假设您不需要在任何地方捕获((即您只想要最内部匹配的parens),您可以明确地确保您不匹配{{1}如果您使用(而不是[^(]+?,则会在群组中的任意位置使用字符。不过,这肯定是一个更严格的选择。你可以在rubular here上看到一个。但重申一下:这不允许组中的.+?字符任何地方,这可能会或可能不会在您使用的其他数据中有效。您还可以将其进一步细化为(。那么完整的正则表达式将是[^()]+/\(([^(]+?)\)/(我相信它们在语义上是等价的,但我可能没有涵盖所有极端情况,后者是最安全的,因为它是最严格)。