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

时间:2018-02-06 08:34:10

标签: regex scala

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

val p = ".*(\\d+ minutes).*".r
val p(m) = "last 12 minutes."

我可以得到" 12分钟"在米 但是如果我想匹配像\\d+ minute(s)?这样的正则表达式呢?例如,如果输入为"12 minutes",我可以获得"last 12 minutes.",如果输入为"12 minute",则可以获得"last 12 minute."

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

2 个答案:

答案 0 :(得分:2)

您可以使用? modifiers?)制作单个字符可选,或使用带有?量词的non-capturing group制作一系列字符(此处为{ {1}})可选:

(?:s)?

或者使用非捕获组:

val p = ".*?(\\d+ minutes?).*".r

请注意,您必须使第一个val p = ".*?(\\d+ minute(?:s)?).*".r val p = ".*\\b(\\d+ minutes(?: left)?).*".r 懒惰,或者您无法将.*放入捕获组。或者使用单词边界12,或者使正则表达式无锚并完全摆脱".*\\b(\\d+ minutes?).*".r

.*

请参阅Scala demo

答案 1 :(得分:1)

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

val p = ".*(\\d+ minutes?).*".r