我需要编写一个正则表达式来告诉我,我正在使用的任何后端框架是否会抛出错误,然后将这些错误存储在数组中以便在必要时进行检索。
问题是,他们使用不同的标签来表示错误。标签如下:
{{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 :(得分: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
我会保留另一个答案,因为我认为它基本上解释了一个人在这样做时会遇到的问题。