2017-03-08 59 views
0

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

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

{{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的左括号关闭。这可能吗?

+0

我想修复后端处理,使错误统一。如果没有,我想你可以通过'(?:\ {\ {| << | \ | \ [| | <\ {:) error(?:\} \} | >> | \] \] \}>)'。 – chris85

回答

1

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

  • (?:\/[\s\S*]*?\*\/|\/\/.*$|\s*^\s*(?!<<|{{|\[\[|<{:)))demo
  • (?:\s*^\s*(?!<<|{{|\[\[|<{:))如果有从来没有评论删除

,然后将此提取错误信息,在格式化字符串,此正则表达式匹配。

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


我会留下对方的回答不变,因为我认为这基本上说明了问题,一个人可能会遇到这样做。

+0

我已经将它们合并为一个标签'[[error]]'并且全部在一行上,但是我无法获得正则表达式来将所有错误捕获到数组中。 https://jsfiddle.net/8e9Lfdjf/ – SISYN

+0

@DanL问题的一大部分是我忘记了在第一个正则表达式中考虑{{。我只是错过了它,巧合的是我的演示中没有任何东西。 **这是固定的。**这一切似乎现在工作。**单独**如果你不从一个字符串派生它们,你可以在JavaScript中编写更清晰的正则表达式,能够使用单斜杠。最后,你可以使用这个来标准化标签并避免循环'({{error}} | | [[[[error]] | <{:error:}>''替换为'[[error]]''。道歉,https://jsfiddle.net/8e9Lfdjf/5/ –

+0

不能感谢你的耐心! – SISYN

1

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

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

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

但是,如果你的代码是真的缩进喜欢你的例子(它可能不,这可能是你使其可读),你应该能够使用这样的({{error}}|<<error>>|\[\[error\]\]|<{:error:}>)\s*(\s*{(.*?(?=$)|[\s\S]*?^)})?,(demo

这是什么东西做的是

  • 捕获从{}在同一行上,如果它不能,则进行到步骤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]]和任何其他组合,他可能知道的。

+0

感谢流体答案和演示,但我还有一个问题。它不会总是被格式化,你是正确的,有时根本没有空间。我无法在没有空白的情况下使用这个示例,而我无法在“Message”字段中显示JSON。 – SISYN

+0

@DanL忘记在最后的评论中标记你。不确定你是否看到它。你可以修改你的帖子,输入你遇到的问题吗? –

+0

我在这个小提琴中评论过我有问题。如果你看到我正在做的事情可以做得更有效率,随时也可以改变这一点。 https://jsfiddle.net/3de9tLfz/ – SISYN