匹配字符串但忽略可选后缀?

Matching a string but ignoring an optional suffix?

我想捕获字符串的开头但忽略可选后缀 View

可能的输入:

Shell
ShellView
Console
ConsoleView

预期产出:

Shell
Shell
Console
Console

这个表达明显是错误的,问号让一切都被第一组捕获:

(\w+)(View)?

如果我使用像 (Shell)(View)? 这样的表达式,它确实有效,但仅适用于以 Shell 开头的字符串,当然没有其他内容。

问题:

这样的正则表达式应该怎么写?

您可以使用

^(\w+?)(?:View)?$

regex demo详情:

  • ^ - 字符串开头
  • (\w+?) - 第 1 组:任何一个或多个单词字符,尽可能少
  • (?:View)? - 一个可选的 non-capturing 组与 View 字符序列匹配一次或零次
  • $ - 字符串结尾。

看到一个C# demo:

var texts = new List<string> { "Shell", "ShellView", "Console", "ConsoleView" };
var rx = new Regex(@"^(\w+?)(View)?$"); 
foreach (var text in texts) 
{
    var match = rx.Match(text)?.Groups[1].Value;
    Console.WriteLine(match);
}

输出:

Shell
Shell
Console
Console

这是另一种方法,看起来很快(98 步)。

^\w+?(?=View$|$)

Here是在线演示。


  • ^:字符串的开始
  • \w+?:匹配任意一次到无限次之间的单词字符,越少越好。
  • (?=):正面前瞻。
    • View$:匹配字符串末尾的View
    • |: 或者
    • $: 字符串结束