排除以开头,但包括以结尾

本文关键字:包括 结尾 开头 排除 | 更新日期: 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;
}

演示