排除以某个字符开头但包含以某个字符结尾

4

我自己无法解决这个问题,我需要匹配以 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());
        }

我需要输出类似以下的内容:

filename_aspx

3个回答

6

那是一个正向后行断言的工作:

Regex r = new Regex(@"(?<=\bASP\.)\S+_aspx");

(?<=\bASP\.) 确保匹配开始位置之前存在 ASP.,但不将其包含在匹配结果中。 \b 是一个 单词边界锚点,它断言我们不匹配 WASP,只匹配 ASP

\S+ 匹配一个或多个非空白字符(假设您的文件名不包含空格)。


0

这个正则表达式应该适用于你的情况:ASP\.(.+_.*?)\s,你可以在Rubular上验证。

解释

  • ASP\. - 查找字符串ASP.以确定起始位置。
  • (.+_.*?) - .+匹配任意字符1次或多次,_匹配下划线以假设我们已经到达字符串的末尾,.*?表示获取任意字符0次或多次,但它是非贪婪匹配,因此只会取到必要的内容,直到下一个匹配为止。
  • \s - 下一个匹配项,查找空格,因此您将获得文件名,因为.*?停止。

0

即使没有正则表达式,您也可以实现这一点(更有效):

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;
}

演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接