我想在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)
答案 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