JavaScript正则表达式符号出现

时间:2016-01-20 10:27:00

标签: javascript regex

我在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

感谢。

2 个答案:

答案 0 :(得分:1)

你需要限制.*(匹配除换行符之外的零个或多个字符,尽可能多)与匹配.*?的惰性点匹配除换行符之外的零个或多个字符,尽可能少:

^([A-Z]+)\s+([^\s]+)\s+([^\s]+)\s(\[.*?\])\s+(.+)$
                                    ^^^

请参阅the regex demo

您还可以将[^\s]替换为\S来缩短模式:

^([A-Z]+)\s+(\S+)\s+(\S+)\s(\[.*?\])\s+(.+)$

Another demo

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)或其他。