当你想匹配两种模式中的任意一种但不需要捕获它时,你可以使用非捕获组?:
:
/(?:https?|ftp)://(.+)/
但是如果我想从字符串'john_1'中捕获'_1',该怎么办呢?它可能是以'2'或''开头,后面跟着任何其他字符。 我首先尝试了一个非捕获组:
'john_1'.gsub(/(?:.+)(_.+)/, "")
=> ""
它不起作用。我告诉它不要捕获一个或多个字符,而是捕获_和其后的所有字符。
相反,以下内容可以正常工作:
'john_1'.gsub(/(?=.+)(_.+)/, "")
=> "john"
我使用了正向先行断言。我找到的正向先行断言的定义如下:
但是这个定义并不完全适用于我的例子。是什么使得正向先行断言能够起作用,而非捕获组无法在我提供的示例中起作用呢?q(?=u)匹配后面跟着u的q,但不将u包含在匹配结果中。正向先行断言构造是一对括号,其中开头的括号后跟一个问号和等于号。
'john_1'.split('_').first
不是更适合吗? - Aleksei Matiushkin