正则表达式:将可选字符串匹配到组

Regex: Match optional string to group

我有一个描述对象的文件,其中对象的某些属性是可选的。例如(颜色可选):

type=dog
sex=male
name=wolf
color=brown
type=dog
sex=male
name=bob
type=cat
sex=male
name=tom
color=black
type=dog
sex=female
name=simona
color=white

我正在寻找一个正则表达式,它可以为我提供一对狗“名字”-“颜色”的属性。我正在等待这样的事情:

wolf - brown
bob - 
simona - white

我从

开始
type=dog[\s\S]*?name=(\w+)[\s\S]*?color=(\w+)

哪个给错了:

wolf - brown
bob - black
simona - white

然后我用颜色(给出相同的颜色)做了组并添加了“?”量词:

type=dog[\s\S]*?name=(\w+)[\s\S]*?(color=(\w+))?

但是,我在所有比赛中都输给了第二组,而不是预期的结果:

wolf - 
bob - 
simona - 

我的表情有什么问题,如何达到我的目的。请不要使用 Lookbehind、Lookahead 和 Conditionals。 VBScript 不执行它们。

My example on regex101.com

设置 regex.Multiline = True 并使用以下正则表达式:

^type=dog[\s\S]*?^name=(\w+)(?:(?:(?!^type=)[\s\S])*?^color=(\w+))?

regex demo

详情

  • ^ - 行首
  • type=dog - 一个字符串
  • [\s\S]*? - 0 个或更多字符尽可能少
  • ^ - 行首
  • name= - 文字字符串
  • (\w+) - 第 1 组:任何一个或多个字母、数字或下划线
  • (?:(?:(?!^type=)[\s\S])*?^color=(\w+))? - 一个可选的 non-capturing 组匹配 1 次或 0 次出现
    • (?:(?!^type=)[\s\S])*? - 任何字符,0 次或更多次,尽可能少,不在行首 type= 子字符串开始
    • ^color= - color= 子串行首
    • (\w+) - 第 2 组:任意一个或多个字母、数字或下划线