【问题标题】:Regex to Identify Try-Catch and Try-Catch finally blocks contained in a .cs file用于识别 Try-Catch 和 Try-Catch 的正则表达式最终块包含在 .cs 文件中
【发布时间】:2013-02-23 03:43:19
【问题描述】:

您好,我正在尝试创建一个应用程序来帮助我切换 Catch-Block 的测试内容并将其替换为生产内容。我能够阅读我的文件并解析内容,但是在创建正则表达式(我仍然是全新的)来识别 try-catch 块时遇到问题,因此我可以选择删除或更改内容捕捉块。请问谁能帮我解决这个问题??

到目前为止,我有下面的表达式(根本不起作用)

try{*}catch(*){*)

提前致谢。

【问题讨论】:

  • 您能否也发布一些您用来删除/替换内容的 C# 代码?
  • 我还没有把那部分放在一起。我坚持在文本文件中识别 try-Catch 或 try-Catch Final。我将 try-catch 读入队列。然后我遍历队列以确保内容确实有效。由于我没有得到正确的正则表达式,所以我被困在那里。

标签: c# .net regex io


【解决方案1】:

您不能编写执行此操作的正则表达式,因为正则表达式 can't be used to match nested patterns。这意味着它将无法识别您的右大括号何时出现与代码中的其他嵌套大括号。您将需要一个解析器生成器,例如 ANTLR,就像链接的答案所建议的那样来完成此操作。

【讨论】:

  • 我记得在 Automata 课上,我学会了如何解析文件中的左大括号和右大括号。我想既然可以做到,那么应该可以使用正则表达式来做类似的事情。还是我错了?
  • 正则表达式无法计算他们看到的开括号和闭括号的数量,因此它们不适合该任务。
【解决方案2】:

我建议看看正在开发的微软Roslyn compiler。它的 API 应该可以让你完成你想做的任何事情。目前处于预览阶段。

【讨论】:

    【解决方案3】:

    我认为这会促使您找到解决方案:

    try\s*\{[^{}]*([^{}]*\{[^{}]*\}[^{}]*)*[^{}]*\}\s*catch\s*\([^()]*(\([^()]*\))*\)\s*\{[^{}]*([^{}]*\{[^{}]*\}[^{}]*)*[^{}]*\}
    

    try\s* 匹配 try 后跟零个或多个空格。

    \{[^{}]*([^{}]*\{[^{}]*\}[^{}]*)*[^{}]*\} 匹配一个块({ 后跟零个或多个字符,除了 { 和 } 后跟零个或多个块,每个块之前和之后都有任意数量的字符)

    \s*catch\s*\([^()]*(\([^()]*\))*\) 匹配 catch 前后的零个或多个空格,然后匹配括号内的内容 ()

    \s*\{[^{}]*([^{}]*\{[^{}]*\}[^{}]*)*[^{}]*\} 类似于 try 块

    注意:如果 cmets 包含 {s 或 }s 可能会失败

    【讨论】:

      猜你喜欢
      • 2014-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-14
      • 2011-02-20
      • 2019-11-15
      • 1970-01-01
      • 2023-02-12
      相关资源
      最近更新 更多