正则表达式部分匹配如果未找到则返回默认参数

时间:2018-04-06 14:08:58

标签: regex

我正在尝试创建正则表达式,以解析SIP联系人信息。

目标是从字符串中获取3个组;用户名,ipaddress和另一个可选参数...

我的问题发生在找不到第3组时...正则表达式没有返回任何内容......不是前两组的事件......

问题是

有没有办法告诉系统一个组是可选的,可以在任何地方,如果该组不在那里返回一个特定值?

当前模式

.*<sip:(.*)@(.*):[1-9]\d*?.*(?=MyArg1=(true|false))

输入

在第一个“;”之后所有参数都用“;”分隔但“name = value”也只能是一个值。即; value1 = true; tag1; tag2; value2 = false

"Display" <sip:CD001@172.24.0.52:5060;MyArg1=true;fs_path=sip%3A172.24.0.23%3Br2%3Don%3Blr>
"Display" <sip:CD001@172.24.0.52:5060;fs_path=sip%3A172.24.0.23%3Br2%3Don%3Blr;MyArg1=true>
"Display" <sip:CD001@172.24.0.52:5060;fs_path=sip%3A172.24.0.23%3Br2%3Don%3Blr;MyArg1=false>
"Display" <sip:CD001@172.24.0.52:5060;fs_path=sip%3A172.24.0.23%3Br2%3Don%3Blr;allo=true;MyArg1=false>
"Display" <sip:CD001@172.24.0.52:5060;fs_path=sip%3A172.24.0.23%3Br2%3Don%3Blr;MyArg1=false;MyArg2=true>
"Display" <sip:CD001@172.24.0.52:5060;fs_path=sip%3A172.24.0.23%3Br2%3Don%3Blr;MyArg1=true;MyArg2=true>
"Display" <sip:CD001@172.24.0.52:5060;fs_path=sip%3A172.24.0.23%3Br2%3Don%3Blr>

与此同时,我非常确定该模式可以更有效......

感谢您的时间! 的Sebastien

1 个答案:

答案 0 :(得分:0)

交替怎么样?我认为这是解决这个问题的合适方法。

(?|.*<sip:(.*)@(.*):[1-9]\d*?.*?(?=MyArg1=(true|false))|.*<sip:(.*)@(.*):[1-9]\d*?.*)

Demo

如果您不需要字符串的开头,请使用此略微优化的模式:

(?|<sip:(.*)@(.*):[1-9]\d*?.*(?=MyArg1=(true|false))|<sip:(.*)@(.*):[1-9]\d*?.*$)