好吧,这主要是一个智力问题(或改进)。
我有一个模式,必须与字符串的开头或结尾(或两者)匹配。
(这里我只是使用'abcd
'作为模式,但是在现实世界中,这是一个相当长且复杂的模式。但这并不有趣,因为它可以工作。)
和往常一样,我使用此正则表达式:
@"^abcd|abcd$"
在这里,重复模式,一次用于字符串的开始,一次用于字符串的结束。
但是,由于该模式又长又复杂,因此我想仅在字符串中指定一次。这将有助于阅读和维护-我只有一个地方可以更改。
以下正则表达式当然不能工作,但是可以让我对我想要的东西有所了解:
@"^abcd$" - matches only 'abcd' exact
@"^?abcd$?" - matches also 'abcd' in the middle
所以,问题是:
是否可以匹配字符串的开头或结尾,并且仅指定一次内部模式?
答案 0 :(得分:5)
您可以使用
(^)?abcd(?(1)|$)
请参见regex demo。
详细信息
(^)?
-一个可选的捕获组,如果位置匹配则其值为空字符串,否则为null abcd
-您的价值(?(1)|$)
-一种条件构造:如果Group 1值不为null(如果已匹配),则什么也不做,否则,匹配字符串的结尾。请参见C# demo:
var strings = new List<string> { "1 abcd", "abcd 1", "1 abcd 1"};
var pattern = "(^)?abcd(?(1)|$)";
foreach (var s in strings)
{
Console.WriteLine("{0} => {1}", s, Regex.IsMatch(s, pattern));
}
输出:
1 abcd => True
abcd 1 => True
1 abcd 1 => False