如果正则表达式具有嵌套组,我如何使用正则表达式匹配字符串?

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)来匹配它?

Ani*_*dha 5

.*可能导致大量的回溯,因为.*首先匹配完整的字符串,然后一个接一个地返回,直到它匹配第一个/.

此外,它不会像您期望的那样正确捕获组中的值.

你应该用 .*?

你的正则表达式应该是

^(.*?)/(.*?)(?:\|(.*?)/(.*?))?$
Run Code Online (Sandbox Code Playgroud)

小字符串不会有任何性能差异,但它会捕获正确组中的值

请注意,?:在正则表达式中,它表示不捕获组(?:\|(.*?)/(.*?))?.因此,仅作为结果将是4个子组.