正则表达式通配符的使用不正确

时间:2015-12-09 13:56:09

标签: regex scala

这是不正确使用通配符?我正在尝试匹配包含日期的String。我不想在返回的String中包含日期,也不希望在匹配的String前面添加String值。

object FindText extends App{

  val toFind = "find1"
  val line = "this is find1 the line 1    \n  21/03/2015"
  val find = (toFind+".*\\d{2}/\\d{2}/\\d{4}").r
  println(find.findFirstIn(line))

}

输出应为:“find1 the line 1 \ n”

但找不到String。

2 个答案:

答案 0 :(得分:2)

问题在于测试字符串中的换行符。 .*显然与换行符不匹配。用.*\\n?.*替换它应该解决它。也可以在正则表达式中使用多行标记,例如:

val find = ("(?s)"+toFind+".*\\d{2}/\\d{2}/\\d{4}").r

答案 1 :(得分:2)

默认情况下,Dot与换行符不匹配。你可以设置一个DOTALL标志来实现它(我还添加了一个“积极的预测 - (?=...)东西 - 因为你不希望日期包含在匹配中”:val find = (toFind+"""(?s).*(?=\d{2}/\d{2}/\d{4})""").r

(另请注意,在scala中,您不需要在字符串中转义特殊字符,用三对引号括起来......非常简洁。)