我的javascript正则表达式是不可靠的

时间:2016-01-27 12:05:44

标签: javascript regex

这是我使用

的正则表达式
.match(/\[(.*)\]\s*([^\s]+)\s*([^\s]+)\s*(.*)/)

并且当有另一个接近的方括号时,它无法正确捕获时间戳

[2016-01-22 22:14:58,098] WARN  service.catalog.MediaController  - foo1 foo foo foo foo foo
[2016-01-22 22:14:58,235] WARN  service.catalog.MediaController  - foo2 foo foo foo foo foo]; sdfd sf sd
[2016-01-22 22:14:58,240] INFO  service.catalog.RestAPIController  - foo3 foo foo foo] foo foo
[2016-01-22 22:14:58,259] INFO  service.catalog.DynamicRoutingController  - foo4 foo foo foo foo foo
[2016-01-22 22:14:58,457] ERROR service.catalog.BaseController  - foo5 foo foo foo foo foo

5 个答案:

答案 0 :(得分:4)

试试这个:

^\[(.*?)\]

Demo - RegEx101

答案 1 :(得分:2)

尝试通过更紧密地匹配模式来使正则表达式更具限制性。

例如,对于开头的时间戳,请使用以下内容:

\[\d{4}-\d\d-\d\d \d\d:\d\d:\d\d,\d\d\d\]

这样你就可以确保没有误报匹配

答案 2 :(得分:1)

您的时间戳似乎有一个直接的布局,为什么不明确捕获它:

var regex = /\[\d{2,4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}(?:,|.)\d+\]/;
'[2016-01-22 22:14:58,235] WARN  service.catalog.MediaController  - foo2 foo foo foo foo foo]; sdfd sf sd'.match(regex) // -> ["[2016-01-22 22:14:58,235]"]

今年我已经包含了2而不是4位数字,你的毫秒被分隔,或者。

答案 3 :(得分:1)

你想要实现的目标并不是很清楚。我的想法是\d{1,4}-\d{1,2}-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2},\d{1,3}。如果您想捕获括号,请将\[\]添加到表达式中。

答案 4 :(得分:1)

这个正则表达式适合你:

/\[[\d-\s:,]+]/gm

demo

PD:你的选择不错,最具体的可能是,这很好:[(\ d \ d \ d \ d- \ d \ d- \ d \ d \ d \ d \ n :\ d \ d:\ d \ d,\ d \ d \ d)]