2

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

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末尾有 a。我是说:

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

但它失败了,正如您在下面的第二个“屏幕截图”中看到的那样。它在 C# 代码中使用了正确的表达式,这个表达式:^\d{1,3}(?:I|D|R)?$

编辑 1

我在这里复制 RegExDesigner 的两个屏幕截图:

RegExDesigner 的第一张截图

RegExDesigner 的第二张截图 - 与 Daniel 建议 -

4

1 回答 1

4

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

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

注意$表达式末尾的 。

1000 个匹配项,因为前三位数字与表达式匹配。如果最后没有丢失的锚点,那么之后有不匹配的字符是有效的。

于 2012-08-07T10:59:07.203 回答