Fre*_*ind 5 regex scala pattern-matching
有一些字符串:
111/aaa
111/aaa|222/bbb
Run Code Online (Sandbox Code Playgroud)
他们是表达形式:
(.*)/(.*)(|(.*)/(.*))?
Run Code Online (Sandbox Code Playgroud)
我试图用它来匹配一个字符串并提取值:
var rrr = """(.*)/(.*)(|(.*)/(.*))?""".r
"123/aaa|444/bbb" match {
case rrr(pid,pname, cid,cname) => println(s"$pid, $pname, $cid, $cname")
case _ => println("not matched ?!")
}
Run Code Online (Sandbox Code Playgroud)
但它打印:
not matched ?!
Run Code Online (Sandbox Code Playgroud)
我想得到:
123, aaa, 444, bbb
Run Code Online (Sandbox Code Playgroud)
怎么解决?
UPDATE
感谢@BartKiers和@ Barmar的anser,我发现我的正则表达式有几个错误,最后找到了这个解决方案:
var rrr = """(.*?)/(.*?)([|](.*?)/(.*?))?""".r
"123/aaa|444/bbb" match {
case rrr(pid,pname, _, cid,cname) => println(s"$pid, $pname, $cid, $cname")
case _ => println("not matched ?!")
}
Run Code Online (Sandbox Code Playgroud)
它有效,但你可以看到有一个_实际上没用.有没有办法重新定义我可以写的正则表达式rrr(pid,pname,cid,cname)来匹配它?
.*可能导致大量的回溯,因为.*首先匹配完整的字符串,然后一个接一个地返回,直到它匹配第一个/.
此外,它不会像您期望的那样正确捕获组中的值.
你应该用 .*?
你的正则表达式应该是
^(.*?)/(.*?)(?:\|(.*?)/(.*?))?$
Run Code Online (Sandbox Code Playgroud)
小字符串不会有任何性能差异,但它会捕获正确组中的值
请注意,?:在正则表达式中,它表示不捕获组(?:\|(.*?)/(.*?))?.因此,仅作为结果将是4个子组.