.net System.Text.RegularExpressions在regexp中嵌套regexp

时间:2013-11-15 15:29:42

标签: c# regex

我想问任何熟练的.net开发人员,如果有可能定义正则表达式(使用.net RegularExpressions名称空间cpabilities),其中包括对另一个正则表达式的引用。我想描述语法规则,每个规则作为单个正则表达式。最终的正则表达式是语法的起始符号。

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

例如,以类似regexp的形式具有以下类似ini的文件语法(不遵循microsoft regexp规则,只是一般规则):

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>

我想:

  • 检查句子是否属于该语言的一部分(真/假) - 似乎微不足道:匹配<line>起始符号。
  • 访问类似终端的符号值(例如<section><key><value>...) - 我想这可以通过命名匹配组(或其他)来实现确切的是它被称为 - 仍然需要在msdn上阅读一些细节。)
  • 我不指望你编写代码,只要你能给我一些提示,是否有可能(以及如何),因为我还没有找到这个信息。所有示例都用于单个正则表达式匹配。

谢谢。

1 个答案:

答案 0 :(得分: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 );
}

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