繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM