Regex 在scala中提取与正则表达式匹配的子字符串时如何使用括号

Regex 在scala中提取与正则表达式匹配的子字符串时如何使用括号,regex,scala,Regex,Scala,我知道在scala中提取与正则表达式匹配的字符串的基本方法: val p = ".*(\\d+ minutes).*".r val p(m) = "last 12 minutes." 我可以在m中得到“12分钟”。 但是如果我想匹配正则表达式,比如\\d+minute(s)?。例如,如果输入是“最后12分钟”,我可以得到“12分钟”,如果输入是“最后12分钟”,我可以得到“12分钟” “*(\\d+minute(s)?).*.r不起作用,可能括号用于标记我们想要的匹配正则表达式,因此正则表达式

我知道在scala中提取与正则表达式匹配的字符串的基本方法:

val p = ".*(\\d+ minutes).*".r
val p(m) = "last 12 minutes."
我可以在m中得到“12分钟”。 但是如果我想匹配正则表达式,比如
\\d+minute(s)?
。例如,如果输入是
“最后12分钟”
,我可以得到
“12分钟”
,如果输入是
“最后12分钟”
,我可以得到
“12分钟”

“*(\\d+minute(s)?).*.r
不起作用,可能括号用于标记我们想要的匹配正则表达式,因此正则表达式中出现的更多括号不起作用。我知道,
“*(\\d+minutes]?).*.r
可以满足我的要求,但是如果我想匹配
\\d+minutes(left)?
在这种情况下,我必须在匹配的部分中使用括号?

您可以使用(
s?
)使单个字符成为可选字符,或者使用带有
的量词来生成字符序列(这里,
(?:s)?
)可选:

val p = ".*?(\\d+ minutes?).*".r
或使用非捕获组:

val p = ".*?(\\d+ minute(?:s)?).*".r
val p = ".*\\b(\\d+ minutes(?: left)?).*".r
请注意,必须将第一个
*
设置为惰性,否则将无法将
12
加入捕获组。或者使用单词边界“
”*\\b(\\d+minutes?.*.r
”,或者将正则表达式设为unchored,并将其全部去掉:

val p = """(\d+\s+minutes?)""".r.unanchored
val s = "last 12 minutes."
val res = s match { 
    case p(m) => m
    case _ => ""
}
// => 12 minutes

请参阅。

默认情况下,问号
将引用前一个字符。因此,以下内容应与
分钟
分钟
匹配:

val p = ".*(\\d+ minutes?).*".r
非常感谢,“非捕获组”,这就是我想要的。另外,对于未经处理的问题,请咨询thx。