复杂的正则表达式问题

时间:2010-07-06 07:58:02

标签: c# regex parsing

我需要从字符串中解析writeln("test"); 我使用(?<type>writeln)\((?<args>[^\)]*)\);作为正则表达式,但这并不完美,如果你尝试解析writeln("heloo :)");或类似的东西,正则表达式不会解析它(因为引号中的')' )。有没有办法注册,因为')'在引号中,正则表达式应该忽略它,并寻找下一个')'?

谢谢,
最大

3 个答案:

答案 0 :(得分:2)

为什么不为此编写一个小解析器?只需遍历字符并拥有一个简单的状态机进行解析。

这种问题在正则表达式中很难做到,因为问题(语法)不规律。在SO中查看parsing HTML with regex;)

但是如果您在某种程度上控制输入,那么您可能只能逃脱正则表达式。在这里查看其他答案的“足够好”的方法。

这基本归结为:

  1. 决定兔子洞的深度(你要模拟多少“递归”)
  2. 为每个这样的递归创建一个替代(分支)正则表达式
  3. 下次需要更改正则表达式时刺伤你的眼睛
  4. 我一直这样做。而且我讨厌自己!

答案 1 :(得分:1)

您遇到了使用正则表达式解析非常规语言时遇到的问题。

话虽如此,试试:

(?<type>writeln)\((?<args>("[^"]*"|))\);

这不完美,但没有什么。

答案 2 :(得分:1)

以下内容将匹配writeln("hello :) \"world\"!");

等模式

string regex = "(?<type>writeln)\\(\"(?<args>(\\\\\"|[^\"])*)\"\\);";

我假设这仅适用于单个参数。