匹配字符串但忽略可选后缀?
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
|
: 或者
$
: 字符串结束
我想捕获字符串的开头但忽略可选后缀 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
|
: 或者$
: 字符串结束