如何用正则表达式匹配四种To:头格式并提取指定分组?
问题解决:匹配带/不带<>的To头SIP地址及Tag
原正则的核心问题是[^<]+这部分——它会贪婪匹配所有非<的字符,导致不带<>的输入里,sip:开头的地址被这部分完全吃掉,后续捕获组自然无法匹配到目标内容。
修正后的正则表达式:
To:\s*(?:<\s*)?(?<from>sip:[^\s>]+)(?:\s*>)?\s*(?:;tag=([^\r\n;]+))?\s*
关键修改说明:
- 移除了原表达式中导致匹配失败的
[^<]+,替换为可选的<\s*,用于处理带<>的场景 - 调整SIP地址匹配规则为
sip:[^\s>]+:精准匹配从sip:开始,直到空格或>结束的内容,同时兼容带/不带<>的两种格式 - 保留了可选的
\s*>(用于闭合<>)和可选的tag捕获组逻辑
四种输入的匹配结果验证:
- 输入:
To: <sip:alice@wonderland.com:5080>;tag=myTag- Group1:
sip:alice@wonderland.com:5080 - Group2:
myTag
- Group1:
- 输入:
To: <sip:alice@wonderland.com:5080>- Group1:
sip:alice@wonderland.com:5080 - Group2: (空,无匹配)
- Group1:
- 输入:
To: sip:alice@wonderland.com:5080- Group1:
sip:alice@wonderland.com:5080 - Group2: (空,无匹配)
- Group1:
- 输入:
To: sip:alice@wonderland.com:5080;tag=myTag- Group1:
sip:alice@wonderland.com:5080 - Group2:
myTag
- Group1:
C#使用提示:
如果输入内容可能包含换行,可启用RegexOptions.Singleline模式;若均为单行格式,使用默认模式即可。
内容的提问来源于stack exchange,提问作者Vincent
相关产品推荐
相关产品推荐

