我有一个以逗号分隔的列表,我需要将其解析为键值对。这是字符串的样子:
TeacherName='Yoda',TeacherIsJedi=TRUE,TeachersAidNames=('Mace'),TeachersAidAlive=(FALSE),TeachersAidAges=(72),NumberOfStudents=3,StudentAges=(42,59,19)
可以分解为的模式:
单字符串值
TeacherName='Yoda'
单个布尔值/数值
TeacherIsJedi=TRUE
NumberOfStudents=3
String Arrays(有时带一个值)
TeachersAidNames=('Mace')
StudentNames=('Anakin','Obi Wan','Luke')
布尔/数值数组(有时带有一个值)
TeachersAidAlive=(FALSE)
TeachersAidAges=(72)
StudentAges=(42,59,19)
键是字母数字,没有空格。
由于它们可能包含在字符串中以及作为数组的分隔符,我不能只使用逗号分割,并且感觉正则表达式可能是获得每个键值对的好方法,然后我可以进一步操作。
我对贪婪/懒惰的理解是有限的,似乎我要么匹配第一个之后的所有内容,要么只能匹配没有值的每个键。我的最新尝试:
,?\w*=\(?.*?\)?
有人可以引导我使用正则表达式模式,这样我可以匹配所有这些键/值对吗?
答案 0 :(得分:0)
Regex101有助于在行动https://regex101.com/r/BzyfpN/3
中展示它这可能有所帮助:
(?<pair>(?<key>.+?)(?:=)(?<value>[^=]+)(?:,|$))
仅捕获一对&#34;键&#34;和&#34;值&#34;
(?<pair>(?<key>... )... (?<value>... )
+?是一个懒惰的量词,它可以做出最小的匹配,然后扩展到最大的连续匹配,因为捕获组&#34;对&#34;需要&#34;关键&#34;以&#39; =&#39;结尾它基本上是这样说的:&#34;匹配从这里开始的第一个&#39; =&#39;字符是&#34;键&#34;
(?<key>.+?)(:?=)
这种方式的工作原理大致相同,只是使用贪婪+而不是使用lazy + im,这样可以实现最大的匹配。所以。+(?:,| $)会说:匹配从这里开始到最后&#39;,&#39;或结束字符串。哪个几乎我们想要什么,但没有什么可以阻止它包含下一个&#34;对&#34;在那场比赛中。所以,我排除了&#39; =&#39;来自贪婪量词的人物,因为我知道&#39; =&#39;将成为每对&#34;的一部分。它将匹配除了收费之外的每个字符,&#39;&#39; &#34;对&#34;
(?<value>[^=]+)(?:,|$)