A (?:...)
是一个非捕获群,匹配并且仍然consumes文本。这意味着该组匹配的文本部分仍会添加到整体匹配值中。
一般来说,如果你想匹配某些东西但不消费,你需要使用环顾四周。因此,如果您需要匹配后面带有特定字符串的内容,请使用积极的前瞻, (?=...)
构造:
some_pattern(?=specific string) // if specific string comes immmediately after pattern
some_pattern(?=.*specific string) // if specific string comes anywhere after pattern
如果您需要匹配但之前“从匹配中排除”某些特定文本,请使用积极的后视:
(?<=specific string)some_pattern // if specific string comes immmediately before pattern
(?<=specific string.*?)some_pattern // if specific string comes anywhere before pattern
注意.*?
or .*
- 也就是说,模式*
, +
, ?
, {2,}
甚至{1,3}
量词 - 在后向模式中,正则表达式引擎并不总是支持它们,但是,C# .NET 正则表达式引擎幸运地支持它们。 Python PyPi 也支持它们regex
模块、Vim、JGSoft 软件以及现在的 ECMAScript 2018 兼容 JavaScript 环境。
在这种情况下,您可以捕获您需要获取的内容并仅匹配上下文而不捕获:
var testEcl = "\"D:\\src\\repos\\myprj\\bin\\Debug\\MyApp.exe\" /?";
var asmName = string.Empty;
var m = Regex.Match(testEcl, @"([^\\]+)\.exe", RegexOptions.IgnoreCase);
if (m.Success)
{
asmName = m.Groups[1].Value;
}
Console.WriteLine(asmName);
See the C# demo
Details
-
([^\\]+)
- 捕获组 1: 一个或多个字符以外的字符\
-
\.
- 一个字面点
-
exe
- 字面意思exe
子串。
由于我们只对捕获第 1 组内容感兴趣,因此我们捕获m.Groups[1].Value
,而不是全部m.Value
(其中包含.exe
).