从字符串末尾匹配多个实例
本文关键字:实例 字符串 | 更新日期: 2023-09-27 18:20:48
我试图构建一个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