如何将一组值与组1匹配

时间:2014-11-20 08:12:51

标签: regex pcre

正在努力解决SO中发布的正则表达式问题,但却被这个问题困住了。

来自此字符串

Ob=Web technology,OB=Product SPe,OB=Dev profile,OB=Computer Management,oB=Hardware Services,cd=sti,CD=com,cd=ws

必须删除以下值。

Web technology,Product SPe,Dev profile,Computer Management,Hardware Services

我正在尝试下面的正则表达式。

(?=Ob)(?:(\w+=)([\w\s]+,?))+

我的假设是group 1应该包含所有键,而group 2应该包含所有值。但是除了最后一个键值对之外的所有其他值都被分配到group 0

有没有办法让所有值都到group 2

here is what I was working on

4 个答案:

答案 0 :(得分:1)

,?cd=.*?(?:,|$)|ob=

试试这个。empty string。请参阅演示。不要忘记标记i

http://regex101.com/r/lZ5mN8/59

cd=.*?(?:,|$)|[^=,]+=(.*?)(?=,|$)

试试这个。$1。见。演示。

http://regex101.com/r/lZ5mN8/57

答案 1 :(得分:1)

正则表达式的问题是group 1group 2包含在非捕获组中。这导致整个正则表达式被group 0捕获。而另一件事是积极的前瞻阻止了正则表达式进行全局匹配。

以下正则表达式会将所有keys收集到group 1valuesgroup 2

(\w+)=([\w\s]+)(?=[,\s]+)

检查它是如何works here的。

答案 2 :(得分:0)

正则表达式:

(?i)Ob=([^,]+)|(?!.*\bob\b).+

替换字符串:

$1

DEMO

  • (?i)将进行不区分大小写的匹配。
  • Ob=([^,]+)组索引1包含所有Ob值。
  • |
  • (?!.*\bob\b).+匹配任何字符一次或多次,但不会包含\bob\b

答案 3 :(得分:0)

这个正则表达式适合你:

^(?!Ob=).*(*SKIP)(*F)|(\w+)=(\w+(?=,|$))

您可以看到您获得了组#1中的所有密钥以及组#2中的所有值。

RegEx Demo