正则表达式解析逗号分隔的键值对与值的逗号

时间:2018-05-04 19:55:58

标签: regex vb.net

我有一个以逗号分隔的列表,我需要将其解析为键值对。这是字符串的样子:

TeacherName='Yoda',TeacherIsJedi=TRUE,TeachersAidNames=('Mace'),TeachersAidAlive=(FALSE),TeachersAidAges=(72),NumberOfStudents=3,StudentAges=(42,59,19)

可以分解为的模式:

  1. 单字符串值

    TeacherName='Yoda'
    
  2. 单个布尔值/数值

    TeacherIsJedi=TRUE
    NumberOfStudents=3
    
  3. String Arrays(有时带一个值)

    TeachersAidNames=('Mace')
    StudentNames=('Anakin','Obi Wan','Luke')
    
  4. 布尔/数值数组(有时带有一个值)

    TeachersAidAlive=(FALSE) 
    TeachersAidAges=(72)
    StudentAges=(42,59,19)
    
  5. 键是字母数字,没有空格。

    由于它们可能包含在字符串中以及作为数组的分隔符,我不能只使用逗号分割,并且感觉正则表达式可能是获得每个键值对的好方法,然后我可以进一步操作。

    我对贪婪/懒惰的理解是有限的,似乎我要么匹配第一个之后的所有内容,要么只能匹配没有值的每个键。我的最新尝试:

    ,?\w*=\(?.*?\)?
    

    有人可以引导我使用正则表达式模式,这样我可以匹配所有这些键/值对吗?

1 个答案:

答案 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>[^=]+)(?:,|$)