簡體   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