我知道在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)?
,我必须在匹配的部分使用括号呢?
答案 0 :(得分:2)
您可以使用?
modifier(s?
)制作单个字符可选,或使用带有?
量词的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)
问号?
默认情况下会引用前一个字符。因此,以下内容应与minute
或minutes
匹配:
val p = ".*(\\d+ minutes?).*".r