反向顺序的C#正则表达式范围

时间:2015-11-18 09:03:19

标签: c# .net regex

我有名字中允许使用的ASCII字符列表。所以,我试图使用范围( - )激活运算符构建正则表达式模式,字符串长度应为40。

最后,我最终创建了以下模式。

^([\x20-\x21\x23-\x25\x28-\x2E\x30-\x3B\x3F-\x7E\xA0-\xFF]){0,40}$

使用此模式我指定了字符串中允许的字符的ASCII代码范围。

但它以相反的顺序抛出Range的异常。我经历了几个问题。我发现它是因为超( - )字符而发生的。所以,为了消除这个问题,我必须使用转义序列( - )而不是( - )。

添加转义序列后,虽然它不会抛出异常,但它没有给出所需的结果。

所以,我想知道我的模式是正确的还是马上指定ASCII代码字符范围。

1 个答案:

答案 0 :(得分:3)

你需要使用否定的character class,删除分组,量词,锚点并修正拼写错误:

[^\x20-\x21\x23-\x25\x28-\x2E\x30-\x3B\x3F-\x7E\xA0-\xFF]

请参阅regex demo(在here之前找到1个匹配项)并使用它,如下面的C# demo所示:

var str = "  some text here ";
if (str.Length > 40 || Regex.IsMatch(str, @"[^\x20-\x21\x23-\x25\x28-\x2E\x30-\x3B\x3F-\x7E\xA0-\xFF]"))
    Console.WriteLine("The line is too long or contains invalid char(s)!");

请注意,在[^....]表示法的帮助下形成一个否定的字符类,并匹配除字符类中指定的字符以外的所有字符。

如果性能是关键,则需要将正则表达式声明为带有RegexOptions.Compiled标志的静态只读字段。看看Kurt Schindler's Regular expression performance comparisons blog