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

    }
}

正規表現式の構成を容易にするために、私は次を使用します: 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(重要)

式の最後にaがあるため、RegExDesignerは式に失敗していnew lineました。つまり:

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

しかし、下の2番目の「スクリーンショット」でわかるように失敗します。そして、C#コードで使用されている正しい式があります。これは次のとおりです。^ \ d {1,3}(?:I | D | R)?$

編集1

RegExDesignerから2つのスクリーンショットをここにコピーします。

RegExDesignerからの最初のスクリーンショット

RegExDesignerからの2番目のスクリーンショット-ダニエルのアドバイス付き-

4

1 に答える 1

4

正規表現を最初だけでなく最後にも固定する必要があります。

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

$式の最後にあることに注意してください。

最初の3桁が式と一致するため、1000が一致します。そして、最後に欠落しているアンカーがなければ、その後に一致しない文字があることは有効です。

于 2012-08-07T10:59:07.203 に答える