2016-07-25 36 views
1

嗨,試圖從給定的字符串中提取我需要的字符串。給定的字符串如下所示。使用重複數據獲取值的正則表達式

1 | A1 | ID11-name11中,x | A2 | ID21-name21,Y | A3 | ID31-name31〜ID32-name32,Y4 | A4 | id41-name41〜ID42-name42〜id43-name43

預期輸出:

A1〜name11 | A2〜name21 | A3〜name31 | A3〜name32 | A4〜name41 | A4〜name42 | A4〜name43

正則表達式:

(^|,)[^|]{0,}\|([^|]{0,})\|(~){0,}[^-]{0,}-([^,~]{0,}) 

提取$ 2〜$ 4 |或\ 2〜\ 4 |

正則表達式輸出:

A1〜name11 | A2〜name21 | A3〜name31 |

是否有可能使用正則表達式獲得a3~name32以及a3~name31?使用多個正則表達式也很好。管道符號後第三部分的值不限於4個不同的值(id41-name41~id42-name42~id43-name43)。這可能就像id41-name41~id42-name42~id43-name43~id43-name43~id43-name43~id43-name43...

+0

是否限定爲4(或無限制) – Bohemian

+0

@Bohemian不限於4,但限於某個固定值 – Prashanth

回答

1

你有兩個選擇第一個是將字符串拆分成許多部分,並得到你想要的。 第二個取決於最長的重複部分。你的情況是idxx-namexx。 如果它僅限於合理您可以在你的正則表達式中重複該部分,以便獲得所有部分。例如,對於2您需要添加第二部分如下:

([a-zA-Z]\d)\|(id\d+-(name\d+))(~?id\d+-(name\d+))? 
______________-------1-------- _---------2--------_________ 

組將成爲 \ 1〜\ 3 \ 1〜\ 5

可以在Regex101 Site

檢查
+0

感謝您的回答。但是'id31-name31〜id32-name32'的值不限於兩個值,可以是'id31-name31〜id32-name32〜id32-name32〜id32-name32'。有沒有其他解決方案? – Prashanth

+0

是否僅限於4?重複分組的問題只會捕獲最後一個匹配組,這就是爲什麼如果你想抓住它們,你需要多次重複第二組。 –

+0

沒有。它甚至不限於4.可以有任何數量的重複。 – Prashanth