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

Matching multiple instances from end of the string

本文关键字:实例 字符串      更新时间:2023-09-26

我试图构建一个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).*)$

在这一点上,我认为我所需要做的就是添加一个*来匹配前一组的许多内容,将regex变成:

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

然而,当在https://regex101.com/.它仍然只是匹配最后一个实例。我还尝试添加了一个新的线路检测,但它仍然只匹配最后一条线路:

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

有人能解释一下我如何匹配其余的吗?为什么这个解决方案不起作用?

要匹配底部,您可以使用基于负前瞻的regex:

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

CCD_ 8将匹配任何字符中的0个或多个,同时断言没有字符在下一位置具有CCD_ 9。

['s'S]将匹配包括换行符在内的任何字符。

PS:使用单词边界:更安全

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

RegEx演示

我知道你正试图用正则表达式来实现这一点,但这里有一个非正则表达式选项:

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

根据您的输入,生成:

位于C:''Source''MooDEdge''Code''MooD16''MooD.LandscapeExplorer''Controllers''LandscapeController.cs:line 143中的MooD.LandiseExplorer.Controller.GetContextInstanceCount(BusinessContext上下文)位于System.Linq.Enumerable.d_1`2.MoveNext()位于System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()位于System.Collections.Generic.List`1.ctor(IEnumerable`1集合)位于System.Linq.Enumerable.ToList[TSource](IEnumerable`1源)在MooD.LandscapeExplorer.Controller.LandscapeController.ProcessContext(String[]类型、String[]实例、QueryFilter[]筛选器)中的C:''Source''MooDEdge''Code''MooD16''MooD.LandscapeExplorer ''Controllers''LandscapeController.cs:line 125