Javascript 从字符串末尾匹配多个实例
我试图构建一个regex语句,但显然我理解错了什么。我有一个C#Javascript 从字符串末尾匹配多个实例,javascript,c#,regex,Javascript,C#,Regex,我试图构建一个regex语句,但显然我理解错了什么。我有一个C#StackTrace,我想基本上裁剪字符串的结尾,直到看到名称空间的第一个实例。这里有一部分数据要说明——用一个手动定位的新行来说明我试图匹配的位置 at MooD.LandscapeExplorer.Controllers.LandscapeController.GetContextInstanceCount(BusinessContext context) in C:\Source\MooDEdge\Code\MooD16
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()
在C:\Source\MooDEdge\code\MooD16\MooD.LandscapeExplorer\Controllers\LandscapeController.cs中的MooD.LandscapeController.GetContextInstanceCount(BusinessContext上下文)中
在System.Linq.Enumerable.d_u1`2.MoveNext()中
在System.Linq.Enumerable.WhereSelectEnumerableInterator`2.MoveNext()中
位于System.Collections.Generic.List`1..ctor(IEnumerable`1集合)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
位于C:\Source\MooDEdge\Code\MooD16\MooD.LandscapeExplorer\Controllers\LandscapeController.ProcessContext中的MooD.LandscapeController.ProcessContext(字符串[]类型,字符串[]实例,查询过滤器[]过滤器):第125行
在lambda_方法中(闭包、控制器基、对象[])
位于System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller,Object[]参数)
位于System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext ControllerContext,IDictionary`2参数)
位于System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext ControllerContext,ActionDescriptor ActionDescriptor,IDictionary`2参数)
在System.Web.Mvc.Async.AsyncControllerActionInvoker.ActionInvoke.InvokeSynchronousActionMethod()中
所以我想保留前半部分,并从字符串中删除后半部分。我使用了消极的前瞻(我从另一个问题抓起,我真的不明白它是如何工作的)来匹配除情绪以外的任何事情。然后我卡在了字符串$
的一端
(在(?!MooD.*)$
在这一点上,我认为我需要做的就是添加一个*
来匹配前面的组,将正则表达式变成:
(在(?!MooD.*)*$
但是,在上进行测试时,这并不像我预期的那样有效。它仍然与最终实例匹配。我还尝试添加了一个新行检测,但仍然只匹配最后一行:
(在(?!MooD)。*\n?*$
有人能解释一下我如何匹配其余部分,以及为什么这个解决方案不起作用吗?要匹配底部部分,您可以使用这个基于负前瞻的正则表达式:
at (?:(?!MooD)[\s\S])*$
(?:(?!MooD)[\s\s])*
将匹配任何字符中的0个或多个,同时声明在下一位置没有字符具有MooD
[\s\s]
将匹配任何字符,包括换行符
PS:使用单词边界更安全:
at (?:(?!\bMooD\b)[\s\S])*$
我知道您正试图用正则表达式实现这一点,但这里有一个非正则表达式选项:
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);
}
公共静态字符串GetMooDStackTrace(字符串stackTrace)
{
var line=stackTrace.Split('\n');
int lastLineWithMood=-1;
对于(int i=0;i
根据您的输入,生成:
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
在C:\Source\MooDEdge\Code\MooD16\MooD.LandscapeExplorer\Controllers\LandscapeController.GetContextInstanceCount(BusinessContext上下文)中的MooD.LandscapeController.GetContextInstanceCount(BusinessContext上下文)中
在System.Linq.Enumerable.d_u1`2.MoveNext()中
在System.Linq.Enumerable.WhereSelectEnumerableInterator`2.MoveNext()中
位于System.Collections.Generic.List`1..ctor(IEnumerable`1集合)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
位于C:\Source\MooDEdge\Code\MooD16\MooD.LandscapeExplorer\Controllers\LandscapeController.ProcessContext中的MooD.LandscapeController.ProcessContext(字符串[]类型,字符串[]实例,查询过滤器[]过滤器):第125行
你能不能在马车返回时把整件事分开,然后(向后工作)丢弃每一行,直到你找到正确的方向?基于您链接到的regex演示,regex对于您想要接受的内容似乎有些过火-然后发现JavaScript不支持单行选项:(该死,不知怎的,我想到了Java。无论如何,它也可以在JS中完成。请看现在的更新答案。谢谢-目前正在尝试,JavaScript在(?:(?!MooD)[\s\s])*/:无效组。我猜它不是一个完全实现的Regex抱歉,另一个输入错误,
(?)
不应该在那里(更正)啊-我错过了其中一个的$
,似乎最后一个使用boundary这个词的方法是令人高兴的。抱歉-我不清楚正则表达式是否是用JavaScript执行的。应该比较容易移植,但我不太会使用JS,所以我不会尝试。我想我会把它留给下一代。是的-我看到它可能会被用于为他人提供保险