有一些字符串:
111/aaa
111/aaa|222/bbb
它们的表达形式是:
(.*)/(.*)(|(.*)/(.*))?
我尝试用它来匹配字符串并提取值:
var rrr = """(.*)/(.*)(|(.*)/(.*))?""".r
"123/aaa|444/bbb" match {
case rrr(pid,pname, cid,cname) => println(s"$pid, $pname, $cid, $cname")
case _ => println("not matched ?!")
}
但它打印:
not matched ?!
我想要得到:
123, aaa, 444, bbb
如何解决?
<小时/>更新
感谢@BartKiers和@Barmar的回答,我发现我的正则表达式有几个错误,最后找到了这个解决方案:
var rrr = """(.*?)/(.*?)([|](.*?)/(.*?))?""".r
"123/aaa|444/bbb" match {
case rrr(pid,pname, _, cid,cname) => println(s"$pid, $pname, $cid, $cname")
case _ => println("not matched ?!")
}
它可以工作,但是你可以看到有一个实际上没有用的_
。有什么方法可以重新定义正则表达式,我只需编写 rrr(pid,pname,cid,cname)
来匹配它?
最佳答案
.*
可能会导致大量回溯,因为 .*
会首先匹配完整字符串,然后逐个返回,直到匹配第一个 /
.
它也不会像您期望的那样正确捕获组中的值..
您应该使用.*?
你的正则表达式应该是
^(.*?)/(.*?)(?:\|(.*?)/(.*?))?$
小字符串不会有任何性能差异,但它会捕获正确组中的值
注意正则表达式中的 ?:
,这意味着不捕获组 (?:\|(.*?)/(.*?))?
。所以结果只是 4 个子组。
关于regex - 如果正则表达式有嵌套组,如何使用正则表达式来匹配字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17482843/