多年的正则表达式

时间:2010-01-23 20:29:19

标签: 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.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);
}

为什么会失败?

5 个答案:

答案 0 :(得分:3)

试试这个:

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

答案 1 :(得分:2)

你应该省略[],因为那些是角色类的指标

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

另外,正则表达式很慢。使用if(date <= 2099 && date>=1900)要快得多

答案 2 :(得分:2)

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

public string anStart
{
    get;
    set;
}

在您的测试方法中,您需要使用:

AnUnivBO target = new AnUnivBO() { anStart = "2009" };

要继续使用整数,请使用RangeValidator

[RangeValidator(1900, RangeBoundaryType.Inclusive,
                2099, RangeBoundaryType.Inclusive)]
public anStartint anStart 
{
   get; set;
)

答案 3 :(得分:0)

试试这个:

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

答案 4 :(得分:0)

在Python中,^(19|20)\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