I would like to capture the beginning of a string but ignore an optional suffix View.
Possible inputs:
Shell
ShellView
Console
ConsoleView
Expected outputs:
Shell
Shell
Console
Console
This expression is obviously wrong, the question mark makes everything captured by the first group:
(\w )(View)?
If I use an expression like (Shell)(View)? it does work but then only for strings that begin with Shell, nothing else of course.
Question:
How should such regex pattern be written ?
CodePudding user response:
You can use
^(\w ?)(?:View)?$
See the regex demo. Details:
^- start of string(\w ?)- Group 1: any one or more word chars, as few as possible(?:View)?- an optional non-capturing group matching aViewchar sequence one or zero times$- end of string.
See a 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);
}
Output:
Shell
Shell
Console
Console
CodePudding user response:
Here is another way to do it, which seems to be fast (98 steps).
^\w ?(?=View$|$)
Here is the online demo.
^: Start of the String\w ?: Matches any word character between one and unlimited times, as few as possible.(?=): Positive lookahead.View$: MatchesViewat the end of the string|: Or$: End of the string
