我有一个字符串
str = (größen xs-xxl)s+m+l+xl+xxl+xxxl(Solid-Farben)Dark Grey (2890)+Black (9000)+Mocca (5050)+Cognac (5048)
由四部分组成:
1: (größen xs-xxl)
2: s+m+l+xl+xxl+xxxl
3: (Solid-Farben)
4: Dark Grey (2890)+Black (9000)+Mocca (5050)+Cognac (5048)
最初,字符串描述了颜色和大小的变化,并且总是以相同的方式组合在一起:
1)第一个键(大小或颜色类别的名称,这次“größenxs-xxl”在括号中 2)第一个键的值,以加号分隔 3)括号中的第二个键(此时“Solid-Farben”) 4)第二个键的值,用加号分隔。不幸的是,空格和括号也是值字符串的一部分。
所有部件都粘在一起,我的工作是对这些东西进行逆向工程 到目前为止,我已经考虑到以下想法制作了这个正则表达式:
首先我需要括号内的键名,所以把所有内容放在括号内:
(\([^+)]+\))
由于这也捕获了属于第二个键值的括号内的数字(例如(2890),第二个部分是负向超前断言,测试后面的加号或行尾。结束括号。
(?!\+|$)
这些放在一起捕获我的字符串的关键组件:
regex = /(\([^+)]+\))(?!\+|$)/
1.9.3-p374 :085 > str.scan regex
=> [["(größen xs-xxl)"], ["(Solid-Farben)"]]
现在我正在绝望地试图提取相应的值。当然,我可以迭代关键数组,拆分源字符串并处理收集的结果 - 但这非常难看。
更优雅的方法是将正则表达式加倍并在其间添加(。+)以获得尾随值 - 部分:
regex = (\([^+)]+\))(?!\+|$)(.+?)(\([^+)]+\))(.+?)$
1.9.3-p374 :096 > str.scan regex
=> [["(größen xs-xxl)", "s+m+l+xl+xxl+xxxl", "(Solid-Farben)", "Dark Grey (2890)+Black (9000)+Mocca (5050)+Cognac (5048)"]]
,这正是我想要的。但是,尽管几乎与后处理第一个正则表达式一样丑陋,但这个解决方案没有考虑到可能有第三个键,相应的值,也添加到原始字符串:
1: (größen xs-xxl)
2: s+m+l+xl+xxl+xxxl
3: (Solid-Farben)
4: Dark Grey (2890)+Black (9000)+Mocca (5050)+Cognac (5048)
5: (NEW DIMENSION)
6: V-NECK+O-NECK+SIZE(tall)+SIZE(short)
str2 = (größen xs-xxl)s+m+l+xl+xxl+xxxl(Solid-Farben)Dark Grey (2890)+Black (9000)+Mocca (5050)+Cognac (5048)(NEW DIMENSION)V-NECK+O-NECK+SIZE(tall)+SIZE(short)
这在各个方面都有所突破,因为我现在需要三次捕获。当然,我的原始正则表达式只是为了匹配两次出现,但如果我不知道有多少部分“粘在一起”怎么办?
那些脑子比我大的人可以开导我吗?我希望看到这样做更加优雅,并且作为奖励功能,在“粘合在一起”到源字符串之前,扩展到原始部分的无限次出现(或甚至只有一个)。 (:
答案 0 :(得分:1)
您可以尝试以下string.scan
功能。
> str = "(größen xs-xxl)s+m+l+xl+xxl+xxxl(Solid-Farben)Dark Grey (2890)+Black (9000)+Mocca (5050)+Cognac (5048)(NEW DIMENSION)V-NECK+O-NECK+SIZE(tall)+SIZE(short)"
> str.scan(/\([^()]*\).*?(?=\((?![\w\d]+\))[^\)]*\)|$)/)
=> ["(größen xs-xxl)s+m+l+xl+xxl+xxxl", "(Solid-Farben)Dark Grey (2890)+Black (9000)+Mocca (5050)+Cognac (5048)", "(NEW DIMENSION)V-NECK+O-NECK+SIZE(tall)+SIZE(short)"]
> str.scan(/(\([^()]*\))(.*?)(?=\((?![\w\d]+\))[^\)]*\)|$)/)
=> [["(größen xs-xxl)", "s+m+l+xl+xxl+xxxl"], ["(Solid-Farben)", "Dark Grey (2890)+Black (9000)+Mocca (5050)+Cognac (5048)"], ["(NEW DIMENSION)", "V-NECK+O-NECK+SIZE(tall)+SIZE(short)"]]