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相同的行为,您必须确保在这两种代码中指定相同的选项,正如您所发现的那样。更改选项可能导致正则表达式的行为非常不同。。。