正则表达式和C#检查范围数+ char(可选)

时间:2012-08-07 10:53:12

标签: c# regex

我正在尝试使用此类检查有效的Regex表达式:

using System.Text.RegularExpressions;

namespace Checking
{
    public static class CheckALF
    {
        public static bool IsValueOk(string value)
        {
            Regex isValidNumber = new Regex(@"^\d{1,3}(?:I|D|R)?", RegexOptions.IgnoreCase);
            if (isValidNumber.IsMatch(value)) {
                return true;
            }
            return false;            
        }

    }
}

为了方便regexp表达式构造,我使用: http://www.radsoftware.com.au/regexdesigner/

但是我尝试了很多在'regexdesigner'上运行但没有在C#.net 4上运行的东西,所以我对此有点不知所措。

我把测试代码(仅部分)放在这里,测试失败。

using Checking;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace TestCheck
{
    [TestClass]
    public class TestCheckALF
    {
        [TestMethod]
        public void Check_IsValid_OnlyNumbers_LessThan3Digits()
        {
            Assert.IsTrue(CheckALF.IsValueOk("40"));
            Assert.IsTrue(CheckALF.IsValueOk("0"));
            Assert.IsTrue(CheckALF.IsValueOk("999"));
        }

        [TestMethod]
        public void Check_IsValid_OnlyNumbersMoreThan3Digits()
        {
            Assert.IsFalse(CheckALF.IsValueOk("1000"));  //  ERROR.......
        }

        [TestMethod]
        public void Check_IsValid_NumbersAndR_LessThan3Digits()
        {
            Assert.IsTrue(CheckALF.IsValueOk("40R"));
            Assert.IsTrue(CheckALF.IsValueOk("0R"));
            Assert.IsTrue(CheckALF.IsValueOk("999R"));
        }

        [TestMethod]
        public void Check_IsValid_NumbersAndL_LessThan3Digits()
        {
            Assert.IsTrue(CheckALF.IsValueOk("40I"));
            Assert.IsTrue(CheckALF.IsValueOk("0i"));
            Assert.IsTrue(CheckALF.IsValueOk("999I"));
        }
    }
}

提前致谢。


编辑2(重要)

RegExDesigner表达式失败,因为表达式最后有一个new line。我的意思是:

^ \ d {1,3}(?:I | D | R)?
<new line>

但它失败了,你可以在下面的第二个“截图”中看到。并且它具有在C#代码中使用的正确表达式,这个: ^ \ d {1,3}?(?:I | d | R)$

编辑1

我在这里复制了两个来自RegExDesigner的截图:

First screenshot from RegExDesigner

Second screenshot from RegExDesigner -with Daniel advice-

1 个答案:

答案 0 :(得分:4)

你需要不仅在开头而且在结尾处锚定正则表达式:

@"^\d{1,3}(?:I|D|R)?$"

请注意表达式末尾的$

1000个匹配,因为前三个数字与表达式匹配。并且在最后没有丢失的锚,它是有效的,之后有不匹配的字符。