我正在尝试使用此类检查有效的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"));
}
}
}
提前致谢。
RegExDesigner表达式失败,因为表达式最后有一个new line
。我的意思是:
^ \ d {1,3}(?:I | D | R)?
<new line>
但它失败了,你可以在下面的第二个“截图”中看到。并且它具有在C#代码中使用的正确表达式,这个: ^ \ d {1,3}?(?:I | d | R)$
我在这里复制了两个来自RegExDesigner的截图:
答案 0 :(得分:4)
你需要不仅在开头而且在结尾处锚定正则表达式:
@"^\d{1,3}(?:I|D|R)?$"
请注意表达式末尾的$
。
1000个匹配,因为前三个数字与表达式匹配。并且在最后没有丢失的锚,它是有效的,之后有不匹配的字符。