字符串格式检查给出意外结果(正则表达式)

问题描述 投票:1回答:3

我想检查一个字符串的格式是ABC-nnn,其中ABC用大写字母表示字母(英文)。 nnn代表三位数,例如123001012一个完整的例子是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。请提供您的见解。

c# .net regex
3个回答
4
投票

你真的检查了你传入正则表达式的字符串是什么样的吗?即评估$@"^[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);

0
投票

你的花括号被字符串插值所消耗,并没有进入正则表达式。如果你试图打印正则表达式,你会发现它是这样的

^[A-Z]3-\d3

这完全是另一回事。


0
投票

格式化时将删除{}。试试这个:

        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);
    } 
© www.soinside.com 2019 - 2024. All rights reserved.