我想检查一个字符串的格式是ABC-nnn
,其中ABC
用大写字母表示字母(英文)。 nnn
代表三位数,例如123
或001
或012
一个完整的例子是FBI-026
。我使用了regex
,下面是我的代码。
public bool IsSubstringMatchingFormat(int numberOfLettersBeforeHyphen, int numberOfNumbersAfterHyphen, string stringToMatch)
{
Regex regex = new Regex($@"^[A-Z]{numberOfLettersBeforeHyphen}-\d{numberOfNumbersAfterHyphen}");
return regex.IsMatch(stringToMatch);
}
我称之为IsSubstringMatchingFormat(3, 3, "SMB-123")
,但它返回false
。请提供您的见解。
你真的检查了你传入正则表达式的字符串是什么样的吗?即评估$@"^[A-Z]{numberOfLettersBeforeHyphen}-\d{numberOfNumbersAfterHyphen}"
and,看看你是否想要正则表达式?我可以告诉你,这不是因为它最终会成为^[A-Z]3-\d3
,它不会做你想要的。
我认为你想要的是:
$@"^[A-Z]{{{numberOfLettersBeforeHyphen}}}-\d{{{numberOfNumbersAfterHyphen}}}"
这会将转义的花括号添加回正则表达式中,以便:
^[A-Z]{3}-\d{3}
使用String.Format
相当于:
String.Format(
@"^[A-Z]{{{0}}}-\d{{{1}}}",
numberOfLettersBeforeHyphen,
numberOfLettersAfterHyphen);
你的花括号被字符串插值所消耗,并没有进入正则表达式。如果你试图打印正则表达式,你会发现它是这样的
^[A-Z]3-\d3
这完全是另一回事。
格式化时将删除{}。试试这个:
public static bool IsSubstringMatchingFormat(int numberOfLettersBeforeHyphen, int numberOfNumbersAfterHyphen, string stringToMatch)
{
var expre = @"^[A-Z]{numberOfLettersBeforeHyphen}-\d{numberOfNumbersAfterHyphen}";//
expre = expre.Replace("numberOfLettersBeforeHyphen", numberOfLettersBeforeHyphen.ToString())
.Replace("numberOfNumbersAfterHyphen", numberOfNumbersAfterHyphen.ToString());
Regex regex = new Regex(expre);
return regex.IsMatch(stringToMatch);
}