You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C#正则表达式实现重复引号的正确匹配?

问题描述

当前使用的正则表达式代码为:

Regex.Match(ln, "\"[\\u0000-\\u007E]+\"")

当目标字符串ln包含重复引号(如""text...""、"""text..."""等)时,无法按预期匹配。需要实现以下规则:

  • 引号数量为偶数时,匹配最外层一对引号包裹的内容;
  • 引号数量为奇数时,截断最后一个引号后匹配;
  • 支持匹配"text1"text2"text3"这类字符串。

具体匹配示例:

  • "stack"overflow" → 匹配"stack"
  • "stack""overflow" → 匹配"stack""overflow"
  • text1""text2""text3 → 匹配""text2""
  • "text1"text2"text3 → 匹配"text1"
解决方案

使用以下正则表达式即可满足需求:

Regex.Match(ln, "\"(?:\"|[^"])*?(?=(?:\"{2})*$|(?!\"))")

正则解析

  • ":匹配起始的双引号;
  • (?:\"|[^"])*?:非捕获组,匹配任意数量的双引号或非双引号字符,*?采用非贪婪模式,确保优先找到符合结束条件的位置;
  • (?=(?:\"{2})*$|(?!\")):正向预查,用于确定匹配的结束点:
    • (?:\"{2})*$:保证从当前位置到字符串末尾的引号数量为偶数(成对存在);
    • (?!\"):或者当前位置之后没有双引号(处理奇数引号的截断场景)。

示例验证

针对给出的示例逐一验证:

  1. "stack"overflow":起始引号后,遇到第一个单独的引号(后接非引号字符),触发(?!")条件,匹配停止,得到"stack";
  2. "stack""overflow":从起始引号到末尾共有4个引号(偶数),满足(?:\"{2})*$条件,完整匹配得到"stack""overflow";
  3. text1""text2""text3:正则找到第一个符合条件的引号块,从第一个"到第四个",末尾到字符串结尾无多余引号(数量为0,偶数),匹配得到""text2"";
  4. "text1"text2"text3:起始引号后遇到单独的引号(后接非引号字符),触发(?!")条件,匹配停止,得到"text1"。

内容的提问来源于stack exchange,提问作者Filipe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 11:10:41