我在JS中使用正则表达式有一些问题。我写了我的正则表达式:
/^([A-Z]+)\s+([^\s]+)\s+([^\s]+)\s(\[.*\])\s+(.+)$/g
但是它通过一个例子给出了错误的结果:
WARN 2016-01-19 13:17:32,051 [localhost-startStop-1] Duplicate property values for key Data\ Df : [ Date from] and [ Starting Day]
我希望正则表达式将字符串分成这样的部分:
WARN
2016-01-19
13:17:32,051
[localhost-startStop-1]
Duplicate property values for key Data\ Df : [ Date from] and [ Starting Day]
一切都还好,除了最后两部分。我得到了:
[localhost-startStop-1] Duplicate property values for key Data\ Df : [ Date from]
and [ Starting Day]
为什么呢?我想把第一个字符串的那部分分开]。不知道为什么需要第二个。
PS:以下是示例:https://regex101.com/r/wG5xV6/2
感谢。
答案 0 :(得分:1)
你需要限制.*
(匹配除换行符之外的零个或多个字符,尽可能多)与匹配.*?
的惰性点匹配除换行符之外的零个或多个字符,尽可能少:
^([A-Z]+)\s+([^\s]+)\s+([^\s]+)\s(\[.*?\])\s+(.+)$
^^^
您还可以将[^\s]
替换为\S
来缩短模式:
^([A-Z]+)\s+(\S+)\s+(\S+)\s(\[.*?\])\s+(.+)$
var re = /^([A-Z]+)\s+(\S+)\s+(\S+)\s(\[.*?\])\s+(.+)$/gm;
var str = 'INFO 2016-01-20 08:03:21,113 [C3P0PooledConnectionPoolManager[identityToken->1bqu9pa9eq1cqr515yzwu7|6c240779]-HelperThread-#0] Connection to \'rander\' established. Notifying listeners...\nWARN 2016-01-19 13:17:32,051 [localhost-startStop-1] Duplicate property values for key Data\ Df : [ Date from] and [ Starting Day]';
while ((m = re.exec(str)) !== null) {
document.body.innerHTML += "<pre>"+ JSON.stringify([m[1],m[2],m[3],m[4], m[5]], 0, 4) + "</pre>";
}
答案 1 :(得分:1)
你可以试试这个:
^(.*?)(\s*?)(\S*?)(\s*?)(\S*?)(\s*?)(\[.*?\])(\s*)(.*?)$
同时使用\S
.
\S
表示不是sapce。?
意味着减少。这句话的规则可以表示如下
begin + word + space + word + space + word + space + word + space + word + end
它必须首先找到]
,因此我们使用?
来查找它。
如果你想改变这句话的格式,可以替换它使用
($1)\r($3)\r($5)\r($7)\r($9)
或其他。