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