如何用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})*$:保证从当前位置到字符串末尾的引号数量为偶数(成对存在);(?!\"):或者当前位置之后没有双引号(处理奇数引号的截断场景)。
示例验证
针对给出的示例逐一验证:
"stack"overflow":起始引号后,遇到第一个单独的引号(后接非引号字符),触发(?!")条件,匹配停止,得到"stack";"stack""overflow":从起始引号到末尾共有4个引号(偶数),满足(?:\"{2})*$条件,完整匹配得到"stack""overflow";text1""text2""text3:正则找到第一个符合条件的引号块,从第一个"到第四个",末尾到字符串结尾无多余引号(数量为0,偶数),匹配得到""text2"";"text1"text2"text3:起始引号后遇到单独的引号(后接非引号字符),触发(?!")条件,匹配停止,得到"text1"。
内容的提问来源于stack exchange,提问作者Filipe
相关产品推荐
相关产品推荐

