Javascript正则表达式检查错误标记

时间:2017-03-08 16:06:14

标签: javascript json regex

我需要编写一个正则表达式来告诉我,我正在使用的任何后端框架是否会抛出错误,然后将这些错误存储在数组中以便在必要时进行检索。

问题是,他们使用不同的标签来表示错误。标签如下:

{{error}}<<error>>[[error]]<{:error:}>

通常,但并非总是如此,后面会有一组括号。在括号内将是一个字符串;要么是对错误的解释,要么是包含有关错误的更多信息的JSON字符串,如下所示:

<<error>> { Something has gone terribly wrong. }
<<error>> {
   {"some":"json"}
}
<{:error:}> { What went wrong? }

截至目前,它正在对每个标签进行特定检查,效率相当低,如下所示:

if ( string.indexOf('<<error>>') >= 0 )
  // Remove << and >> 
if ( string.indexOf('[[error]]') >= 0 )
  // Remove [[ and ]]
// So forth...

然后,我留下了这样的字符串:

error { Some description. }

error {
  {"some":"json"}
}

我需要一个正则表达式来提取括号之间的内容。这是我写的正则表达式,但是它涉及很多东西:

string.match('/error\s?\{([^\}]+)\}/gi');

正如我所说,这个程序非常低效并且存在问题。

首先,它不允许{}之后的大括号error是可选的。它们应该是可选的。

其次,它不允许JSON,因为当JSON显示它关闭[^}]时,字符集}不匹配。所以我需要一些方法来匹配集合中的所有字符,直到error的左括号关闭。这可能吗?

2 个答案:

答案 0 :(得分:1)

好问题。解释你的问题,展示你尝试过的东西,给出足够的输入实例。

正则表达式,尤其是Javascript的有限实现,对于解析许多语言和数据对象并不理想。在这种情况下,可能难以捕获说5. .*想要转到6并且.*?想要转到4。

{
{
{
}  // 5
}  // 5
}  // 6

但是,如果您的代码真的像您的示例一样缩进(可能不是,那可能是您的可读性),您应该可以使用类似({{error}}|<<error>>|\[\[error\]\]|<{:error:}>)\s*(\s*{(.*?(?=$)|[\s\S]*?^)})?的内容,(How do i push a bill with taxes included

这是做什么的

  • 在同一行从{捕获到},如果不能,则转到第2步(更改。
  • {}之间的所有内容,只要}开始该行。

如果}始终以一定数量的空格作为前缀,则可以在标记的前缀中加上正则表达式中的空格数。

({{error}}|<<error>>|\[\[error\]\]|<{:error:}>)\s*(\s*{(.*?(?=$)|[\s\S]*?^)})?`
                                                                          ^

如果}始终以与打开错误标记相同的空格数作为前缀,则可以执行此操作

([t ]*)({{error}}|<<error>>|\[\[error\]\]|<{:error:}>)(?:[ \t]*({(.*?(?=}$)|[\s\S]*?^\1)})?)demo

对于此示例,查看完整的示例缩进文本非常重要。我演示了它是怎么出错的。

如果这些不起作用,你需要一个更加面向代码的解决方案,但至少你可以用这个来检测错误的存在

({{error}}|<<error>>|\[\[error\]\]|<{:error:}>)

。 Chris85的更简单的版本是糟糕的形式,它可以匹配<<error]]和任何其他组合,这可能是他可能知道的。

答案 1 :(得分:1)

鉴于对我的第一个答案的评论,我将使用这个正则表达式作为替换将数据转换为单行json,正则表达式也删除了注释。它会删除不以正确标记的错误开头的换行符。必须打开多行。

  • (?:\/[\s\S*]*?\*\/|\/\/.*$|\s*^\s*(?!<<|{{|\[\[|<{:)))demo
  • (?:\s*^\s*(?!<<|{{|\[\[|<{:))如果永远不会删除评论

然后这个提取错误信息,在重新格式化的字符串上,这个正则表达式匹配。

({{error}}|<<error>>|\[\[error\]\]|<{:error:}>)[ \t]*(?:(.*)}\s*$)? demo

我会保留另一个答案,因为我认为它基本上解释了一个人在这样做时会遇到的问题。