排除以开头,但包括以结尾
本文关键字:包括 结尾 开头 排除 | 更新日期: 2023-09-27 18:25:35
我自己想不出来,我必须匹配一个以ASP.
开头、以_aspx
结尾的字符串,但我需要排除匹配的开头(ASP.
部分)。
例如,
string input = "random stack trace text ASP.filename_aspx random text";
Regex r = new Regex("Regular expression needed!!!");
var mc = r.Matches(s);
foreach (var item in mc)
{
Console.WriteLine(item.ToString());
}
它需要输出这样的东西,
文件名_aspx
这是一个积极的后备断言的工作:
Regex r = new Regex(@"(?<='bASP'.)'S+_aspx");
(?<='bASP'.)
确保ASP.
刚好出现在比赛的开始位置之前,但它不将其包括在比赛结果中。'b
是一个单词边界锚,它断言我们不匹配WASP
,只匹配ASP
。
'S+
匹配一个或多个非空白字符(这假设文件名不包含空格)。
这应该对你有用,ASP'.(.+_.*?)'s
,这里有一个Rubular来证明它。
解释
ASP'.
-搜索字符串ASP.
以确定起始位置(.+_.*?)
-.+
查找任何字符1次或更多次,_
匹配下划线以假设我们已到达字符串末尾,.*?
表示查找任何字符0次或更多次数,但这是一个非贪婪匹配,因此在到达下一个匹配之前只需要尽可能多的时间's
-下一个匹配,它会查找一个空间,因此您会得到文件名,因为.*?
停止
即使没有regex(更高效的),也可以实现这一点:
string text = "blub ASP.filename_aspx foo ASP.filename2_aspx bah ...";
var matches = new List<string>();
int index = text.IndexOf("ASP", StringComparison.OrdinalIgnoreCase);
int endIndex = index >= 0 ? text.IndexOf("_aspx", index + 1, StringComparison.OrdinalIgnoreCase) : -1;
while (index >= 0 && endIndex >= 0)
{
index += "ASP.".Length;
endIndex += "_aspx".Length;
matches.Add(text.Substring(index, endIndex - index));
index = text.IndexOf("ASP", endIndex + 1, StringComparison.OrdinalIgnoreCase);
endIndex = index >= 0 ? text.IndexOf("_aspx", index + 1, StringComparison.OrdinalIgnoreCase) : -1;
}
演示