C#中编写正则匹配带双引号冒号分隔的GUID格式AppId报错求解
报错原因
原有代码触发编译错误+匹配失效的核心问题有两点:
- C#中
@开头的逐字字符串,内嵌双引号的转义规则不是写\",而是连续写两个双引号""来代表字符串内的一个双引号。原代码直接在逐字字符串里写"appid",内部的双引号会被编译器识别为字符串的结束边界,直接抛出语法错误。 - 正则本身逻辑存在错误:行首
^、行尾$锚点位置放错,值部分前后的双引号缺失,还额外加了和目标格式无关的大括号、圆括号匹配规则,无法命中目标格式的键值对。
修正方案
使用如下正则初始化代码即可,既解决编译错误,也能正确匹配所有大小写写法的AppId键值对:
Regex appIdRegex = new Regex(@"""appid""\s*:\s*""([0-9a-fA-F]{8}-(?:[0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12})""", RegexOptions.IgnoreCase);
正则说明
- 逐字字符串内所有内嵌双引号都用
""转义,完全符合C#语法规则,不会触发编译报错 - 配置了
RegexOptions.IgnoreCase枚举,自动兼容AppId/appid/APPID等所有大小写变体的字段名,不需要额外在正则里写大小写兼容逻辑 - 正则匹配逻辑拆解:
"appid":匹配带双引号包裹的字段名(代码中写为"""appid"""是C#逐字字符串转义后的写法)\s*:\s*:匹配字段名和值之间的冒号,兼容冒号前后任意数量的空白字符- 括号包裹的UUID匹配规则:精准匹配标准8-4-4-4-12格式的UUID值,外层的双引号匹配值前后的引号,分组可以直接通过
Groups[1].Value提取到纯AppId字符串,不带前后引号
- 如果需要严格整行匹配,避免匹配到长文本中内嵌的片段,可以把正则替换为
@"^\s*""appid""\s*:\s*""([0-9a-fA-F]{8}-(?:[0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12})""\s*$",将行首、行尾锚点放在正则的最外侧即可。
以下两种目标格式都可以被上述正则正确命中:
"AppId": "12764ddf-2746-4293-8f63-b79fdc913dca" "appid": "12764ddf-2746-4293-8f63-b79fdc913dca"
内容的提问来源于stack exchange,提问作者Chandler Juego
相关产品推荐
相关产品推荐

