【发布时间】:2018-04-26 00:51:06
【问题描述】:
当您想匹配两个模式中的任何一个但不捕获它时,您将使用非捕获组?::
/(?:https?|ftp)://(.+)/
但是如果我想在字符串 'john_1' 中捕获 '_1' 怎么办。它可以是 '2' 或 '' 后跟其他任何内容。首先我尝试了一个非捕获组:
'john_1'.gsub(/(?:.+)(_.+)/, "")
=> ""
它不起作用。我告诉它不要捕获一个或多个字符,而是捕获 _ 和它之后的所有字符。
改为以下工作:
'john_1'.gsub(/(?=.+)(_.+)/, "")
=> "john"
我使用了积极的前瞻。我发现的正向前瞻定义如下:
q(?=u) 匹配一个 q 是 后跟一个 u,而不使 u 成为匹配项的一部分。积极的 前瞻结构是一对括号,带有开头 括号后跟问号和等号。
但这个定义并不适合我的例子。在我提供的示例中,是什么让积极前瞻工作而不是非捕获组工作?
【问题讨论】:
-
'john_1'.split('_').first是否更适合这种特殊情况?