C# 每隔几年的正则表达式

C# 每隔几年的正则表达式,c#,regex,enterprise-library,C#,Regex,Enterprise Library,在C#中,我想编写一个正则表达式,它只接受1900到2099之间的年份 我尝试了^([1][9]\d\d |[2][0]\d\d)$,但这不起作用。有什么想法吗 所以我在课堂上: [NotNullValidator(MessageTemplate = "Anul nu poate sa lipseasca!")] // [RangeValidator(1900, RangeBoundaryType.Inclusive, 2100, RangeBoundaryType.Inclusi

在C#中,我想编写一个正则表达式,它只接受1900到2099之间的年份

我尝试了
^([1][9]\d\d |[2][0]\d\d)$
,但这不起作用。有什么想法吗

所以我在课堂上:

    [NotNullValidator(MessageTemplate = "Anul nu poate sa lipseasca!")]
  //  [RangeValidator(1900, RangeBoundaryType.Inclusive, 2100, RangeBoundaryType.Inclusive, MessageTemplate = "Anul trebuie sa contina 4 caractere!")]
    [RegexValidator(@"(19|20)\d{2}$", MessageTemplate = "Anul trebuie sa fie valid!", Ruleset = "validare_an")]
    public int anStart
    {
        get;
        set;
    }
在试验方法中:

[TestMethod()]
public void anStartTest()
{
    AnUnivBO target = new AnUnivBO() { anStart = 2009 };
    ValidationResults vr = Validation.Validate<AnUnivBO>(target, "validare_an");
    Assert.IsTrue(vr.IsValid);
}
[TestMethod()]
公共无效测试()
{
AnUnivBO target=newanunivbo(){anStart=2009};
ValidationResults vr=Validation.Validate(目标为“validare_an”);
Assert.IsTrue(vr.IsValid);
}

为什么失败?

您应该省略
[]
,因为这些是字符类的指示符

/^(19\d\d | 20\d\d)$/

而且,正则表达式速度很慢。使用
如果(日期=1900)
快得多

试试以下方法:

^(19|20)\d{2}$
试试这个:

^(19|20)\d{2}$
^((19\d\d)|(20\d\d))$

在Python中,
^(19\d\d)$
起作用

>>> import re
>>> pat=re.compile("^(19|20)\\d\\d$")
>>> print re.match(pat,'1999')
<_sre.SRE_Match object at 0xb7c714a0>
>>> print re.match(pat,'2099')
<_sre.SRE_Match object at 0xb7c714a0>
>>> print re.match(pat,'1899')
None
>>> print re.match(pat,'2199')
None
>>> print re.match(pat,'21AA')
None
>>重新导入
>>>pat=re.compile(“^(19 | 20)\\d\\d$”)
>>>打印重新匹配(pat,'1999')
>>>打印重新匹配(帕特,'2099')
>>>打印重新匹配(帕特,'1899')
没有一个
>>>打印重新匹配(帕特,'2199')
没有一个
>>>打印重新匹配(pat,'21AA')
没有一个

您需要使用字符串属性,而不是整数,RegexValidator才能工作:

public string anStart
{
    get;
    set;
}
在测试方法中,您需要使用:

AnUnivBO target = new AnUnivBO() { anStart = "2009" };
要继续使用整数,请使用:


这也是一个有效的答案
{2}
的意思是:查找其中的两个。您的模式是有效的,尽管它可以缩短。请发布一些示例代码,说明您如何使用它来演示为什么它不适合您。如果我想将anStart用作整数,并验证它是否在1900和2099之间,我应该使用什么?RangeValidator?@TGOD:如果这是您答案的副本,它将包含序列
/d
,该序列匹配一个正斜杠,后跟字母“d”。但是正如您所看到的,这个答案包含一个数字的转义序列
\d
。现在我想,这可能会更好一点,你不觉得吗@-(-1). 现在,关于“正则表达式很慢”的评论…:D