匹配字符串末尾的多个实例

时间:2015-11-06 15:13:21

标签: javascript c# regex

我试图建立一个正则表达式声明,但显然是误解了一些东西。我有一个C#StackTrace,并希望基本上裁剪字符串的结尾,直到我看到我们的命名空间的第一个实例。以下是要说明的数据部分 - 使用手动定位的新行来说明我尝试匹配的位置。

   at MooD.LandscapeExplorer.Controllers.LandscapeController.GetContextInstanceCount(BusinessContext context) in C:\Source\MooDEdge\Code\MooD16\MooD.LandscapeExplorer\Controllers\LandscapeController.cs:line 143
   at System.Linq.Enumerable.<SelectManyIterator>d__1`2.MoveNext()
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at MooD.LandscapeExplorer.Controllers.LandscapeController.ProcessContext(String[] types, String[] instances, QueryFilter[] filters) in C:\Source\MooDEdge\Code\MooD16\MooD.LandscapeExplorer\Controllers\LandscapeController.cs:line 125

   at lambda_method(Closure , ControllerBase , Object[] )
   at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
   at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.ActionInvocation.InvokeSynchronousActionMethod()

所以我想保留前半部分,并从字符串中删除后半部分。我使用了一个消极的前瞻(我从另一个问题中抓住了,我真的不明白它是如何工作的),以匹配MooD以外的任何其他内容。然后我就卡在了字符串$的末尾。

(at (?!MooD).*)$

此时我认为我需要做的就是添加一个*以匹配前一组的许多内容,将正则表达式转换为:

(at (?!MooD).*)*$

然而,在https://regex101.com/上进行测试时,这并不像我预期的那样有效。它仍然只匹配最终实例。我还尝试添加新的线路检测,但仍然只匹配最后一行:

(at (?!MooD).*\n?)*$

任何人都可以解释我如何能够与其他人匹配,以及为什么这个解决方案不起作用?

2 个答案:

答案 0 :(得分:2)

要匹配底部,您可以使用此基于正则表达式的负向前瞻:

at (?:(?!MooD)[\s\S])*$

(?:(?!MooD)[\s\S])*将匹配任何字符中的0个或更多字符,同时声明下一个位置没有字符MooD

[\s\S]将匹配任何字符,包括换行符。

PS:使用字边界更安全:

at (?:(?!\bMooD\b)[\s\S])*$

RegEx Demo

答案 1 :(得分:0)

我知道您正在尝试使用正则表达式执行此操作,但这是一个非正则表达式选项:

public static string GetMooDStackTrace(string stackTrace)
{
    var lines = stackTrace.Split('\n');
    int lastLineWithMood = -1;

    for (int i = 0; i < lines.Length; i++)
    {
        if (lines[i].Contains("MooD"))
            lastLineWithMood = i;
    }

    return string.Join("\n", lines, 0, lastLineWithMood + 1);
}

根据您的输入,生成:

at MooD.LandscapeExplorer.Controllers.LandscapeController.GetContextInstanceCount(BusinessContext context) in C:\Source\MooDEdge\Code\MooD16\MooD.LandscapeExplorer\Controllers\LandscapeController.cs:line 143
   at System.Linq.Enumerable.d__1`2.MoveNext()
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at MooD.LandscapeExplorer.Controllers.LandscapeController.ProcessContext(String[] types, String[] instances, QueryFilter[] filters) in C:\Source\MooDEdge\Code\MooD16\MooD.LandscapeExplorer\Controllers\LandscapeController.cs:line 125