有没有办法在C#regex中定义自定义字符类?
在flex中,它以非常明显的方式完成:
DIGIT [0-9]
%%
{DIGIT}+ {printf( "An integer: %s (%d)\n", yytext, atoi( yytext ) );}
http://westes.github.io/flex/manual/Simple-Examples.html#Simple-Examples
如this answer中所述,在PHP中定义自定义字符类的方式如下:
(?(DEFINE)(?<a>[acegikmoqstz@#&]))\g<a>(?:.*\g<a>){2}
有没有办法在c#中实现这个结果,而不是每次使用它都重复完整的字符类定义?
答案 0 :(得分:3)
C#不支持自定义字符类,但您可以使用named blocks和character class subtraction来获得类似的效果。
.NET定义了与Unicode字符类别(如数学或希腊符号)对应的a large number of named block。可能有一个块符合您的要求。
字符类减法允许您从一个更宽的类中的字符中排除一个类或块中的字符。语法是:
[ base_group -[ excluded_group ]]
以下示例从链接文档中复制,匹配除空格,希腊字符,标点符号和换行符之外的所有Unicode字符:
[\u0000-\uFFFF-[\s\p{P}\p{IsGreek}\x85]]
答案 1 :(得分:2)
不,C#不支持。 This link将为您提供.NET Regex引擎的概述。请注意,没有什么能阻止您定义变量并使用它们来构造您的Regex字符串:
var digit = "[0-9]";
var regex = new Regex(digit + "[A-Z]");