为什么我的javascript匹配返回null?

时间:2012-12-13 02:30:23

标签: javascript regex

使用以下文本作为我的msg变量:

/private UserName:some message without leading whitespace
/private UserName: some message with leading whitespace

以下javascript来解析它:

if(msg.indexOf('/private') == 0){
    msg = msg.substring(8,msg.length);
    var parts = msg.match(/\s+(.+?)\:\s*(.+?)/);

    alert("Name: " + parts[0]);
    alert("Message: " + parts[1]);
}

我希望索引0包含 UserName 和索引1包含某些消息与...

任何人都能看到我错过的东西吗?

3 个答案:

答案 0 :(得分:3)

稍微调整你的正则表达式:

/^\/private\s+(.*?):\s*(.*?)$/

简化您的代码:

var regex = /^\/private\s+(.*?):\s*(.*?)$/;
var parts = regex.exec(msg);

if (parts){
    alert("Name: " + parts[1]);
    alert("Message: " + parts[2]);
}

parts[0]是整个匹配的字符串。您需要parts[1]parts[2]

答案 1 :(得分:1)

var msg = '/private UserName:some message without leading whitespace \
/private UserName: some message with leading whitespace';

if (msg.indexOf('/private') == 0) {
   msg = msg.substring(8,msg.length);
   var parts = msg.match(/\s+(.+?)\:\s*(.+?)/);

   console.log("Name: " + parts[0]);
   console.log("Message: " + parts[1]);
}

打印

  Name:  UserName:s
  Message: UserName

我会调试msgparts变量的值。另外,请检查http://regexpal.com/等网站上的正则表达式。看起来你的正则表达式可能匹配太多了。你想让它以结肠结束吗?如果是这样,请尝试更像这样的事情

\s+(\S+?)\:

答案 2 :(得分:0)

你想要做的是拆分和修剪:)

类似的东西:

parts = msg.split(" ",1)[1].split(":",1);

alert("Name: " + parts[0]);
alert("Message: " + $trim(parts[1]));

trim是一个jquery函数,但你可以使用regex:)