我试图建立一个正则表达式声明,但显然是误解了一些东西。我有一个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?)*$
任何人都可以解释我如何能够与其他人匹配,以及为什么这个解决方案不起作用?
答案 0 :(得分:2)
要匹配底部,您可以使用此基于正则表达式的负向前瞻:
at (?:(?!MooD)[\s\S])*$
(?:(?!MooD)[\s\S])*
将匹配任何字符中的0个或更多字符,同时声明下一个位置没有字符MooD
。
[\s\S]
将匹配任何字符,包括换行符。
PS:使用字边界更安全:
at (?:(?!\bMooD\b)[\s\S])*$
答案 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