匹配字符串的开头或结尾-但仅指定一次模式

时间:2020-04-11 17:32:53

标签: c# regex

好吧,这主要是一个智力问题(或改进)。

我有一个模式,必须与字符串的开头或结尾(或两者)匹配。

(这里我只是使用'abcd'作为模式,但是在现实世界中,这是一个相当长且复杂的模式。但这并不有趣,因为它可以工作。)

和往常一样,我使用此正则表达式:

@"^abcd|abcd$"

在这里,重复模式,一次用于字符串的开始,一次用于字符串的结束。

但是,由于该模式又长又复杂,因此我想仅在字符串中指定一次。这将有助于阅读和维护-我只有一个地方可以更改。

以下正则表达式当然不能工作,但是可以让我对我想要的东西有所了解:

@"^abcd$" - matches only 'abcd' exact
@"^?abcd$?" - matches also 'abcd' in the middle

所以,问题是:

是否可以匹配字符串的开头或结尾,并且仅指定一次内部模式?

1 个答案:

答案 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