年份区间的正则表达式

3
在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);
}

为什么它会失败?

您的模式本身是有效的,尽管它可以被缩短。请张贴一些示例代码以展示为什么它对您不起作用。 - Ahmad Mageed
5个回答

3

试试这个:

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

一个有效的答案是:{2} 表示查找两个这样的。 - Thom Wiggers

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;
)

如果我想将anStart用作整数,并验证其是否在1900年至2099年之间,我应该使用什么?RangeValidator? - qwerty

2

对于字符类,您应该省略[],因为它们是指示符。

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

此外,正则表达式速度较慢。使用if(date <= 2099 && date>=1900)会更快。


-(-1)。现在,关于“正则表达式很慢”的评论... :D - Alan Moore

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

0
尝试这个:

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


1
@TGOD:如果这是你答案的副本,它将包含序列/d,该序列匹配斜杠后跟字母“d”。但正如你所看到的,这个答案包含\d,这是数字的转义序列。现在我想想,这可能会更好一些,你不觉得吗?:@ - Alan Moore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接