我有一些困难。(我擅长使用正则表达式,但在scala / java中并没有多少使用经验。)我有一个长度为11个字符的数字字符串,只需要最后10个字符,因此:
val Pattern = """(\d{10})$""".r
"79283767219" match {
case Pattern(m) => m
}
它会产生“MatchError”,但为什么?我理解错了什么吗?
我有一些困难。(我擅长使用正则表达式,但在scala / java中并没有多少使用经验。)我有一个长度为11个字符的数字字符串,只需要最后10个字符,因此:
val Pattern = """(\d{10})$""".r
"79283767219" match {
case Pattern(m) => m
}
当您使用正则表达式模式进行匹配时,正则表达式模式应该与整个字符串匹配。也就是说,它就像正则表达式模式以^
开头并以$
结尾一样。这是因为match
应该将左侧的整体分解到右侧。
在Scala 2.10中,可以调用unanchored
来获取执行部分匹配的匹配器,如下所示:
val Pattern = """(\d{10})$""".r.unanchored
请放心,您的锚点将被保留。只是期望匹配应该适用于整个字符串的部分将被删除。
unanchored
。 我猜它在模式的 两端 添加了 .*
? 我认为这对于原始问题无效。 它还可能与已经存在的 $
产生不良互动。在某些 RE 方言中(现在太懒得检查),$
仅在它是 RE 中最后一个字符时才是右侧锚定点。 unanchored
有多聪明? - Randall Schulzmatch
结构中使用RegEx
时,我很少需要搜索。 - Randall Schulz{10,}
设置“ 10及以上”。要仅匹配字符串的结尾,您需要明确指定完整模式: val Pattern = """.*(\d{10})$""".r
更新:如果你使用的是Scala 2.10及以上版本,你可以使用Daniel的unanchored
来解决这个问题。否则,你可以采用以下方法进行解决:
Pattern.findFirstIn("79283767219")
^
和 $
符号,但它们似乎隐含在其中。这是不可避免的,还是有一些修改器或选项? - dmitryPattern.findFirstIn("79283767219")
。 - om-nom-nomunapplySeq
方法。 - Daniel C. Sobralunanchored
或 findFirstIn
,^
字符仍然表示整个字符串的开头,而不是行的开头。因此,您需要像 (^|\n)
这样的东西来获取一行的开头(即字符串的开头或换行符)。 - combinatoristPattern
这样的RegEx
实例在match
结构中使用时,它不是搜索,而是匹配!这意味着它必须匹配整个被匹配的值(在Scala术语中称为“scrutinee”-在您的示例中为79283767219
)。MatchError
。.*
来浮动模式。 - Randall Schulz