C# 正则表达式和C检查范围号+字符(可选)

C# 正则表达式和C检查范围号+字符(可选),c#,regex,C#,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)?", R

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

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表达式构造,我使用:

但是我已经尝试了很多在“regexdesigner”上运行的东西,但是没有在C.NET4中运行,所以我对此有点茫然

我把测试代码放在这里,只是测试失败的一部分

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使表达式失败,因为表达式末尾有新行。我的意思是:

^\d{1,3}?:I | d | R

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

编辑1 我在这里复制了RegExDesigner的两个屏幕截图:


您不仅需要在开头锚定正则表达式,还需要在结尾锚定正则表达式:

@"^\d{1,3}(?:I|D|R)?$"
注意表达式末尾的$


1000个匹配项,因为前三个数字与表达式匹配。如果结尾没有缺少锚定符,则后面有不匹配的字符是有效的。

您不仅需要在开头锚定正则表达式,还需要在结尾锚定正则表达式:

@"^\d{1,3}(?:I|D|R)?$"
注意表达式末尾的$


1000个匹配项,因为前三个数字与表达式匹配。如果结尾没有缺少锚点,则后面有不匹配的字符是有效的。

Wait。。你在找什么?超过3个数字,然后是一个字符?或者介于1到3个数字之间,然后是一个字符?regexdesigner对该regex和输入1000有什么作用?Hi@SimonWhitehead我需要1到3个数字和范围为R、D、I的可选字符。ThanksIt与@AakashM:-确定不匹配?我刚刚下载了它,带有^\d{1,3}?:I | d | R?1000和我预期的100匹配…等等。。你在找什么?超过3个数字,然后是一个字符?或者介于1到3个数字之间,然后是一个字符?regexdesigner对该regex和输入1000有什么作用?Hi@SimonWhitehead我需要1到3个数字和范围为R、D、I的可选字符。ThanksIt与@AakashM:-确定不匹配?我刚刚下载了它,带有^\d{1,3}?:I | d | R?1000和我预期的100匹配…没错,丹尼尔。但我必须找到另一个工具来构造正则表达式,因为当我在末尾添加“$”时,任何匹配项都会在RegExDesigner软件中得到。@FerPt:尝试删除设计器中的多行标志,看看会发生什么。删除多行会给我相同的行为—末尾没有与$匹配的项。非常感谢。要在代码中获得与RegexDesigner相同的行为,您必须确保在这两种代码中指定相同的选项,正如您所发现的那样。更改选项可能会导致正则表达式的行为非常不同…对,Daniel就是这样。但我必须找到另一个工具来构造正则表达式,因为当我在末尾添加“$”时,任何匹配项都会在RegExDesigner软件中得到。@FerPt:尝试删除设计器中的多行标志,看看会发生什么。删除多行会给我相同的行为—末尾没有与$匹配的项。非常感谢。要在代码中获得与RegexDesigner相同的行为,您必须确保在这两种代码中指定相同的选项,正如您所发现的那样。更改选项可能导致正则表达式的行为非常不同。。。