Javascript 从第一次出现的字符中拆分字符串

Javascript 从第一次出现的字符中拆分字符串,javascript,regex,split,Javascript,Regex,Split,我在这种格式的日志文件中有多行文本: topic, this is the message part, with, occasional commas. 如何从第一个逗号分割字符串,以便将主题和消息的其余部分放在两个不同的变量中 我尝试过使用这种拆分,但是当消息部分中有更多逗号时,它就不起作用了 [topic, message] = whole_message.split(",", 2); 这种分解分配在Javascript中不起作用(目前)。试试这个: var split = whole_

我在这种格式的日志文件中有多行文本:

topic, this is the message part, with, occasional commas.
如何从第一个逗号分割字符串,以便将主题和消息的其余部分放在两个不同的变量中

我尝试过使用这种拆分,但是当消息部分中有更多逗号时,它就不起作用了

[topic, message] = whole_message.split(",", 2);

这种分解分配在Javascript中不起作用(目前)。试试这个:

var split = whole_message.split(',', 2);
var topic = split[0], message = split[1];
编辑-确定,因此“split()”有点不正确;试试这个:

var topic, message;
whole_message.replace(/^([^,]*)(?:,(.*))?$/, function(_, t, m) {
  topic = t; message = m;
});
使用“除第一个逗号外的所有内容”的正则表达式。因此:

[1]
将成为主题,
[2]
将成为信息。

这里

String.prototype.mySplit = function(char) { 
  var arr = new Array(); 
  arr[0] = this.substring(0, this.indexOf(char)); 
  arr[1] = this.substring(this.indexOf(char) + 1); 
  return arr; 
}

str = 'topic, this is the message part, with, occasional commas.'
str.mySplit(',');
-> ["topic", " this is the message part, with, occasional commas."]

为什么不用逗号分隔,将[0]项作为主题,然后从原始字符串中删除主题(+,)

你可以:

var topic = whole_message.split(",")[0]
(使用prototype.js)

(使用jQuery)


或者更快,使用josh.trowjavascript的
String.split()
方法(至少如果您期望其他语言的
split()
方法提供相同的行为)

这种行为的一个例子是:

console.log('a,b,c'.split(',', 2))
> ['a', 'b']
而不是

> ['a', 'b,c']
如你所料

请尝试此拆分函数:

function extended_split(str, separator, max) {
    var out = [], 
        index = 0,
        next;

    while (!max || out.length < max - 1 ) { 
        next = str.indexOf(separator, index);
        if (next === -1) {
            break;
        }
        out.push(str.substring(index, next));
        index = next + separator.length;
    }
    out.push(str.substring(index));
    return out;
};  
函数扩展_分割(str,分隔符,最大值){
var out=[],
指数=0,
下一个
而(!max | | out.length

(除非你喜欢用复杂的方式做事)

为什么
split(“,”,2)
不适合你?@jjnguy可能是因为这个赋值语句完全是假的:-)JavaScript!=Python:-)@jjnguy,因为如果整个消息类似于“mighty topic,hi,我是用户”,则topic变量将包含“mighty topic”,消息将只包含“hi”,而不是“hi,我是用户”。@Martijn:除非您使用的是Javascript 1.7+解释器、CoffeScript或Harmony解释器,如果可以使用解构赋值:)(以及其他类似Python的功能)——这可能会让OP感到困惑。您忽略了数据可能包含逗号的事实。结果似乎与我的拆分相同:如果存在更多逗号,消息部分也会被拆分。这是因为String.split()在javascript中有点不一致(或者至少它的行为与我使用过的所有其他语言不同)请注意,
\n
不匹配。使用
m
标志匹配换行符
整个消息。匹配(/([^,]*),(.*)/m)/([^,]*),([\s\s]*)/m
@digitalbath:
/。
将永远不会匹配JS中的换行符
/m
不会改变
的工作方式,只有
/s
会。JavaScript对此没有修改器。您必须使用类似于
[\s\s]
的内容。例如:
/^([^,]*),([\s\s]*)/
修改JavaScript内置的原型对象可能会产生意外的副作用。我会远离这种模式。我不会为了这样一个小的、单一用途的东西而修改全局字符串原型。也许,如果这是您将非常频繁地使用的东西,并且在一个您不需要担心名称空间冲突的环境中……我并不是真的想引起这样的抗议,这可能是一个具有两个参数的基本函数。我之所以使用这个原型,是因为它是在我的大脑中从以前的一个项目。
console.log('a,b,c'.split(',', 2))
> ['a', 'b']
> ['a', 'b,c']
function extended_split(str, separator, max) {
    var out = [], 
        index = 0,
        next;

    while (!max || out.length < max - 1 ) { 
        next = str.indexOf(separator, index);
        if (next === -1) {
            break;
        }
        out.push(str.substring(index, next));
        index = next + separator.length;
    }
    out.push(str.substring(index));
    return out;
};  
var a = whole_message.split(",");
var topic = a.splice (0,1);