开头的匹配模式

时间:2014-11-27 05:01:24

标签: c# regex

我想在c#中进行正则表达式匹配,以检查字符串是否以模式的一部分开头。 如果模式是" ABC ... GHI"那么有效字符串的格式可以是" A"," AB"," ABCDEF"," ABCXYXGHI"

这是一个示例代码。真正的正则表达式必须在模式中使其工作

string pattern = "ABC...GHI"

code = "A"  //valid
code = "ABC" valid
code = "ABCDE" //valid
code = "ABCXXX" //valid
code = "ABCXXXGHI" //valid
code = "ABCXXXGHIAA" //invalid
code = "B" //invalid

Regex.IsMatch(code, pattern)

2 个答案:

答案 0 :(得分:1)

你在找这样的东西吗?

var pat = new Regex(@"^A(B(C(.(Z)?)?)?)?");
var testStrings = new string[]
{
    "ALPHA",
    "ABGOOF",
    "ABCblah",
    "ABCbZ",
    "FOOBAR"
};
foreach (var s in testStrings)
{
    var m = pat.Match(s);
    if (m.Success)
    {
        Console.WriteLine("{0} matches {1}", s, m.Value);
    }
    else
    {
        Console.WriteLine("No match found for {0}", s);
    }
}

结果是:

ALPHA matches A
ABGOOF matches AB
ABCblah matches ABCb
ABCbZ matches ABCbZ
No match found for FOOBAR

关键是A之后的所有内容都是可选的。因此,如果您想要以A或AB开头的字符串,您需要:

AB?

如果您想添加ABC,则需要:

A(BC?)?

另一个角色:

A(B(CZ?)?)?

凌乱,但如果你不得不自己编写代码来自动生成表达式。

其他信息

您可能希望字符串不长于模式,并且所有字符必须与模式匹配。也就是说,鉴于我上面显示的模式,“ABCxZ”将是有效的,但“ABCblah”将无效,因为“实验室”部分与模式不匹配。如果是这种情况,那么你需要在模式的末尾添加一个“$”来表示字符串在那里结束。所以:

var pat = new Regex(@"^A(B(C(.(Z)?)?)?)?$");

或者,在您的示例中:

"^A(B(C(.(.(.(G(H(I)?)?)?)?)?)?)?)?$"

答案 1 :(得分:1)

您可以使用?并制作正则表达式的可选部分。最终的正则表达式字符串可能是

A(B(C(.(.(.(G(H(I?)?)?)?)?)?)?)?)?

最后一个字符串非常混乱但您可以自动创建

上面的正则表达式的可视化在这里http://www.regexper.com/#A(B(C(.(.(.(G(H(I%3F)%3F)%3F)%3F)%3F)%3F)%3F)%3F)%3F