I'm learning Scala, so this is probably pretty noob-irific.
I want to have a multiline regular expression.
In Ruby it would be:
MY_REGEX = /com:Node/m
My Scala looks like:
val ScriptNode = new Regex("""<com:Node>""")
Here's my match function:
def matchNode( value : String ) : Boolean = value match
{
case ScriptNode() => System.out.println( "found" + value ); true
case _ => System.out.println("not found: " + value ) ; false
}
And I'm calling it like so:
matchNode( "<root>\n<com:Node>\n</root>" ) // doesn't work
matchNode( "<com:Node>" ) // works
I've tried:
val ScriptNode = new Regex("""<com:Node>?m""")
And I'd really like to avoid having to use java.util.regex.Pattern. Any tips greatly appreciated.
This is a very common problem when first using Scala Regex.
When you use pattern matching in Scala, it tries to match the whole string, as if you were using "^" and "$" (and did not activate multi-line parsing, which matches \n to ^ and $).
The way to do what you want would be one of the following:
Which would find find the first instance of ScriptNode inside value, and return that instance as v (if you want the whole string, just print value). Or else:
Which would print all all value. In this example, (?s) activates dotall matching (ie, matching "." to new lines), and the .* before and after the searched-for pattern ensures it will match any string. If you wanted "v" as in the first example, you could do this:
Just a quick and dirty addendum: the
.r
method onRichString
converts all strings toscala.util.matching.Regex
, so you can do something like this:And that will return
I use this all the time for quick and dirty regex-scripting in the scala console.
Or in this case:
Just my attempt to reduce the use of the word
new
in code worldwide. ;)Just a small addition, use tried to use the
(?m)
(Multiline) flag (although it might not be suitable here) but here is the right way to use it:e.g. instead of
use
But again the (?s) flag is more suitable in this question (adding this answer only because the title is "Scala Regex enable Multiline option")