我在正则表达式方面做得越来越好,但我仍然遇到了一些问题......我正在尝试使用正则表达式从一组括号中提取一个值。我遇到的问题是这个集合前面有一个左括号。
以下是一些例子:
'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"
这只是字符串的一小部分,所以这部分已经拆分了。
任何帮助将不胜感激!
答案 0 :(得分:6)
当表达更精确时,切勿使用圆点。在这种情况下,您希望匹配最里面括号的内容。因此,内容是任何未打开或关闭括号的字符,如下所示:
/\(([^()]+)\)/
答案 1 :(得分:2)
基于该数据集,最简单的做法可能就是将量词添加到开放式数据集中,例如:
/\(+(.+?)\)/
通过这种方式,它可以匹配任何连续数量的开放量,导致你想要捕获的内容,但必须至少在匹配的下一部分之前有一个paren。这里的rubular示例。 注意:正如我在下面提到的那样,这将捕获分组中由其他字符分隔的开放式parens(ridgerider在下面的评论中提供了( (stuff))
的示例,类似于例如(1(1)
。您的示例中没有明确说明这是否是所需的行为,但如果没有,请参阅下文。
假设您不需要在任何地方捕获(
(即您只想要最内部匹配的parens),您可以明确地确保您不匹配{{1}如果您使用(
而不是[^(]+?
,则会在群组中的任意位置使用字符。不过,这肯定是一个更严格的选择。你可以在rubular here上看到一个。但重申一下:这不允许组中的.+?
字符任何地方,这可能会或可能不会在您使用的其他数据中有效。您还可以将其进一步细化为(
。那么完整的正则表达式将是[^()]+
或/\(([^(]+?)\)/
(我相信它们在语义上是等价的,但我可能没有涵盖所有极端情况,后者是最安全的,因为它是最严格)。