刪除@記憶 2020-01-02 16:36 采纳率: 0%
浏览 561

C#正则怎么匹配嵌套的括号的内容

我想要匹配这些内容
_T('收到我');
_T("双引号();");
_T("双引号,我有两个参数",1);
_T("收到双引号,我有三个参数","第二个",'男');
用_T(([^)]*));匹配时得到
共找到 4 处匹配:
_T('收到我');
_T("双引号();
_T("双引号,我有两个参数",1);
_T("收到双引号,我有三个参数","第二个",'男');
在第二行只能得到 _T("双引号();,不能的得到_T("双引号();");
请问大佬们该怎么解决?

  • 写回答

1条回答 默认 最新

  • lshen01 2023-03-17 09:43
    关注

    参考GPT和自己的思路:

    针对这个问题,可以使用正则表达式的“零宽度断言”来解决嵌套括号的匹配问题。具体的正则表达式如下:

    \_T\((?>[^()]+|\((?<>)|\)(?<->)|(?<ce>)\))*\)(?(ce)(?!))
    

    该正则表达式的解释如下:

    1. 首先匹配 "_T(" 字符串;
    2. 然后使用“零宽度正预测先行断言”(?>([^()]+|((?<>)|)(?<->)|(?)))*)),匹配括号内的内容;
    3. 在这个断言中,我们使用了栈来处理嵌套的括号,具体的含义如下:
    • [^()]+ 匹配除了括号之外的所有字符;
    • ((?<>) 匹配左括号,并将一个空的组压入栈中;
    • )(?<->) 匹配右括号,并将一个组弹出栈中;
    • (?))* 匹配右括号后面的内容,并将一个空的组压入栈中,以便在整个表达式结束时检查是否所有的括号都已经正常匹配,如果没有,就需要匹配失败。
    1. 最后,使用“(?(ce)(?!))”来检查是否所有的括号都已经正常匹配,如果没有,就需要匹配失败。

    这个正则表达式可以正确地匹配所有给出的测试用例,包括嵌套的括号和单引号、双引号混合的情况。

    评论

报告相同问题?

悬赏问题

  • ¥50 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?