如何用正则匹配带global::前缀的C#完全限定类型名?
匹配带global::前缀的C#完全限定类型名的正则修正方案
问题分析
你当前使用的正则global((::|\.)\w+(?!\s|\())+存在两个核心问题:
- 前缀匹配不严谨:用
(::|\.)允许了global.这种不符合C#规范的格式,而正确的前缀固定是global:: - 匹配范围失控:外层的
+会贪婪匹配后续的.和标识符,负前瞻(?!\s|\()无法阻止匹配类型名后的方法/成员(因为方法前的.不在前瞻排除范围内),导致捕获到多余的方法名,甚至出现字符截断。
修正后的正则
global::(?:\w+\.)*\w+
如果需要严格符合C#标识符规则(标识符首字符必须是字母/下划线,后续可以是字母/数字/下划线),可以使用更精确的版本:
global::(?:[a-zA-Z_]\w*\.)*[a-zA-Z_]\w*
匹配效果验证
针对你提供的示例代码:
public global::libebur128.EBUR128StateInternal D { get { var __result0 = global::libebur128.EBUR128StateInternal.__GetOrCreateInstance(((__Internal*)__Instance)->d, false); return __result0; } }
修正后的正则会精准匹配到两个目标字符串:
global::libebur128.EBUR128StateInternal global::libebur128.EBUR128StateInternal
完全符合你的期望结果。
正则逻辑说明
global:::精确匹配C#完全限定类型名的固定前缀(?:\w+\.)*:非捕获组,匹配0或多个命名空间段(每个段由标识符加.组成)\w+:匹配最后的类型名标识符
内容的提问来源于stack exchange,提问作者aybe
相关产品推荐
相关产品推荐

