[英]How can I use regex to match strings if the regex has nested group?
有一些字符串:
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
怎么解决?
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 ?!")
}
它有效,但你可以看到有一个_
实际上没用。 有没有办法重新定义正则表达式,我可以写rrr(pid,pname,cid,cname)
来匹配它?
.*
可能导致很多回溯因为.*
首先匹配完整的字符串,然后一个接一个地返回,直到它匹配第一个/
。
此外,它不会像您期望的那样正确捕获组中的值。
你应该使用.*?
你的正则表达式应该是
^(.*?)/(.*?)(?:\|(.*?)/(.*?))?$
小字符串不会有任何性能差异,但它会捕获正确组中的值
注意?:
在正则表达式中,它意味着不捕获组(?:\\|(.*?)/(.*?))?
。 因此,仅作为结果将是4个子组。
试着逃避|
,这是正则表达式中的逻辑OR:
var rrr = """(.*)/(.*)(\|(.*)/(.*))?""".r
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.