我想问任何熟练的.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上阅读一些细节。)谢谢。
答案 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 );
}
这有一个明显的缺点,即代码中存在某种重复,但你可以使用反射来编译(甚至可能创建)静态构造函数中的那些正则表达式。