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

它需要输出这样的东西,

文件名_aspx

4

3 回答 3

6

这是一个积极的后向断言的工作:

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

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

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

于 2013-07-31T14:02:53.723 回答
0

这应该对你有用ASP\.(.+_.*?)\s,这里有一个Rubular 来证明它

解释

  • ASP\.- 搜索字符串ASP.以确定起始位置。
  • (.+_.*?)-.+找到任何字符 1 次或多次,_匹配下划线以假设我们到达字符串的末尾,并.*?表示获取任何字符 0 次或多次,但它是非贪婪匹配,因此只需直到它到达下一场比赛为止。
  • \s- 下一场比赛,它寻找一个空格,所以你得到文件名,因为.*?停止。
于 2013-07-31T14:03:44.757 回答
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;
}

演示

于 2013-07-31T14:22:32.753 回答