Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从字符串末尾匹配多个实例_Javascript_C#_Regex - Fatal编程技术网

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

Javascript 从字符串末尾匹配多个实例,javascript,c#,regex,Javascript,C#,Regex,我试图构建一个regex语句,但显然我理解错了什么。我有一个C#StackTrace,我想基本上裁剪字符串的结尾,直到看到名称空间的第一个实例。这里有一部分数据要说明——用一个手动定位的新行来说明我试图匹配的位置 at MooD.LandscapeExplorer.Controllers.LandscapeController.GetContextInstanceCount(BusinessContext context) in C:\Source\MooDEdge\Code\MooD16

我试图构建一个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()
在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,所以我不会尝试。我想我会把它留给下一代。是的-我看到它可能会被用于为他人提供保险