【问题标题】:Regex: Match optional string to group正则表达式:将可选字符串匹配到组
【发布时间】:2020-08-17 10:19:12
【问题描述】:

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

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

【问题讨论】:

  • VBScript 正则表达式支持前瞻。试试^type=dog[\s\S]*?^name=(\w+)(?:(?:(?!^type=)[\s\S])*?^color=(\w+))?regex.Multiline = True。见this regex demo
  • 看来,你是绝对正确的@WiktorStribiżew。顺便说一句,我对你的答案数量感到非常惊讶。

标签: regex vbscript regex-group optional-values


【解决方案1】:

设置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+))? - 一个可选的非捕获组,匹配 1 次或 0 次
    • (?:(?!^type=)[\s\S])*? - 任何字符,0 次或多次,尽可能少,不会在行首开始 type= 子字符串
    • ^color= - color= 子字符串行首
    • (\w+) - 第 2 组:任何一个或多个字母、数字或下划线

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    相关资源
    最近更新 更多