【发布时间】:2011-03-12 20:33:39
【问题描述】:
我需要一个正则表达式来匹配之前的所有内容,一个匹配某个字符之后的所有内容,例如冒号。
foo:bar
匹配 'foo' 的东西和匹配 'bar' 的东西。
【问题讨论】:
标签: javascript regex
我需要一个正则表达式来匹配之前的所有内容,一个匹配某个字符之后的所有内容,例如冒号。
foo:bar
匹配 'foo' 的东西和匹配 'bar' 的东西。
【问题讨论】:
标签: javascript regex
不要为此使用正则表达式。使用split。
【讨论】:
split 如果值有 : 将失败。
":" 提供split 参数:)
: 之后的字符串部分还包含冒号,则结果将包含 3 个子字符串。这不符合问题的标准,“我需要一个正则表达式来匹配之前的所有内容,一个来匹配 某个字符之后的所有内容,比如冒号”。但是,OP 很可能有点天真地指定了该要求,split 对他来说已经足够了:-)
在正则表达式中,您可以定义组(通过括号)。
"foo:bar".match(/(.*?):(.*)/) // -> ["foo:bar", "foo", "bar"]
// whole regexp, 1st group, 2nd group
.*? in first group 表示 non-greedy 版本的.*,这可以防止它吃掉所有的字符串(尽可能少匹配.'s)
(在这种情况下确实无关紧要,但在匹配时很重要,例如“foo:bar:spam”)
【讨论】:
这里不需要正则表达式。
var middle = str.indexOf(':');
var key = str.substr(0, middle);
var value = str.substr(middle + 1);
如果你确实想使用正则表达式,你可以这样做:
var matches = /([^:]+):(.+)/.exec(str);
var key = matches[1];
var value = matches[2];
【讨论】:
这两个应该这样做:
'foo:bar'.match(/(.*):/)
'foo:bar'.match(/:(.*)/)
字符串中会有多个“:”吗?如果是这样,您可能更喜欢这个:
'foo:bar'.match(/(.*?):/)
【讨论】:
如果你想使用正则表达式而不是 str.split,你可以使用:
var str="foo:bar";
var pattern=/([^:]+):([^:]+)/gi;
var arr=pattern.exec(str);
arr.shift();
现在 arr 将是一个包含两个元素的数组:['foo', 'bar']。
【讨论】:
你想要向前看,向后看。哪些匹配内容后面是某个字符,或者前面是某个字符,但在匹配中不包括该字符。
对于前瞻,你会有类似 .*(?=:) 的东西,这意味着任何字符,0 次或更多次,后跟一个冒号,但不要在匹配中包含冒号,
对于后视,你有 .*(?
【讨论】: