2013-11-15 259 views
2

我想问任何熟练的.net开发人员,如果有可能定义正则表达式(使用.net RegularExpressions名称空间cpabilities),这将包括对另一个正则表达式(一个或多个)。我想描述语法规则,每个规则都是一个正则表达式。最终的正则表达式将是语法的开始符号。.net System.Text.RegularExpressions在正则表达式中嵌套正则表达式

当然我可以执行单行正则表达式的扩展,但可读性会受到影响。我也不想尝试以编程方式包含在开始符号中的每个选项(如foreach(regexp r in line.regexps) {check if r.matches(input)})。

例如具有在正则表达式状以下的ini类文件的语法(不遵循微软的正则表达式规则,只是一般的):

sp   = \s* 
allowed_char = [a-zA-Z0-9_] 
key   = <allowed_char>+ 
value  = <allowed_char>((<allowed_char>|[ ])*<allowed_char>)? 
comment  = (;|(//)|#)(.*) 

empty_line = ^<sp>$ 
line_comment = ^<sp><comment>$ 
section  = ^<sp>\[<sp><value><sp>\]<sp>(<comment>)?$ 
item   = ^<sp><key><sp>=<sp><value><sp>(<comment>)?$ 

line   = <empty_line>|<line_comment>|<section>|<item> 

我想:

  • 检查如果一个句子是该语言的一部分(true/false) - 看起来微不足道:匹配<line>开始符号。
  • 访问终端类的符号值(例如<section><key><value>...) - 我想这可以通过命名匹配组来实现(或者不管它到底是叫 - 仍然在NEDD MSDN读一些细节)。
  • 我不指望你写代码,只是如果你能给我一些提示,是否可能(以及如何),因为我还没有找到这个信息。所有示例均用于单个正则表达式匹配。

谢谢。

回答

1

这是我来到了,当我在做我自己的正则基于数学表达式解析器有:

private static class Regexes { 
    // omitted... 
    private static readonly string 
     strFunctionNames = "sin|ln|cos|tg|tan|abs", 
     strReal = @"([\+-]?\d+([,\.]\d+)?(E[\+-]?\d+)?)|[\+-]Infinit(y|o)", 
     strFunction = string.Format(@"(?<function>{0})(?<argument>{1})", 
      strFuncitonNames, strReal); 

    // omitted... 
    public static readonly Regex 
     FunzioniLowerCase = new Regex(strFunctionNames), 
     RealNumber = new Regex(strReal), 
     Function = new Regex(strFunction); 
} 

这有明显的缺点,即有某种代码重复的,但你可以使用反射在静态构造函数中编译(甚至创建)这些正则表达式。

+0

我明白了,所以你做了扩展,但是在字符串级别使用了替换...如果不可能如何在另一个正则表达式中引用regexps,这可能是解决方案之一。谢谢。 – sharpener

+0

由于没有其他可能性在Regex类中包含子表达式,所以这是唯一的解决方案。 – sharpener