blue-sky
blue-sky

Reputation: 53866

Incorrect use of regex wildcards

This is not correct use of wildcards ? I'm attempting to match String that contains a date. I don't want to include the date in the returned String or the String value that prepends the matched 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))

}

Output should be : "find1 the line 1 \n "

but String is not found.

Upvotes: 0

Views: 99

Answers (2)

Dima
Dima

Reputation: 40510

Dot does not match newline characters by default. You can set a DOTALL flag to make it happen (I have also added a "positive look-ahead - the (?=...) thingy - since you did not want the date to be included in the match": val find = (toFind+"""(?s).*(?=\d{2}/\d{2}/\d{4})""").r

(Note also, that in scala you do not need to escape special characters in strings, enclosed in a triple-quote pairs ... pretty neat).

Upvotes: 2

irundaia
irundaia

Reputation: 1730

The problem lies with the newline in the test string. A .* does not match newlines apparently. Replacing this with .*\\n?.* should fix it. One could also use a multiline flag in the regex such as:

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

Upvotes: 2

Related Questions