2

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

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 没有实现它们。

我在 regex101.com 上的示例

4

1 回答 1

0

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

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

查看正则表达式演示

细节

  • ^- 一行的开始
  • type=dog- 一个字符串
  • [\s\S]*?- 0个或更多字符尽可能少
  • ^ - 一行的开始
  • name= - 文字字符串
  • (\w+)- 第一组:任何一个或多个字母、数字或下划线
  • (?:(?:(?!^type=)[\s\S])*?^color=(\w+))?- 一个可选的非捕获组匹配 1 或 0 次出现
    • (?:(?!^type=)[\s\S])*?- 任何字符,0 次或多次,尽可能少,不会type=在行首开始子字符串
    • ^color=-color=一行的子字符串开始
    • (\w+)- 第 2 组:任何一个或多个字母、数字或下划线
于 2020-08-17T11:00:05.123 回答