我需要一个正则表达式来匹配之前的所有内容,并且需要匹配某个字符之后的所有内容,例如冒号。
foo:bar
匹配'foo'的东西和匹配'bar'的东西。
答案 0 :(得分:7)
不要使用正则表达式。使用split。
答案 1 :(得分:2)
这里不需要正则表达式。
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];
答案 2 :(得分:2)
在正则表达式中,您可以定义组(通过括号)。
"foo:bar".match(/(.*?):(.*)/) // -> ["foo:bar", "foo", "bar"]
// whole regexp, 1st group, 2nd group
第一组中的 .*?
表示.*
的非贪婪版本,可以防止它吃掉所有字符串(匹配尽可能少.
's)
(在这种情况下这无关紧要,但是当你匹配时很重要,例如“foo:bar:spam”)
答案 3 :(得分:1)
这两个应该这样做:
'foo:bar'.match(/(.*):/)
'foo:bar'.match(/:(.*)/)
字符串中是否会有多个“:”?如果是这样,你可能更喜欢这个:
'foo:bar'.match(/(.*?):/)
答案 4 :(得分:1)
如果要使用正则表达式而不是str.split,可以使用:
var str="foo:bar";
var pattern=/([^:]+):([^:]+)/gi;
var arr=pattern.exec(str);
arr.shift();
现在arr将是一个包含两个元素的数组:['foo','bar']。
答案 5 :(得分:1)
你想要前瞻和后视。哪个匹配的东西后跟或以某个字符开头,而不包括匹配中的该字符。
为了预见,你会有类似。*(?= :),这意味着任何字符,0次或更多次,后跟冒号,但不包括匹配中的冒号,
对于后视,你有。*(?< = :),这意味着任何字符0次或更多次,前面有冒号,但不包括匹配中的冒号。这里的诀窍是后视表达式在其余部分之后出现,这看起来很直观,因为你正在寻找之前的冒号,但这是因为任何正则表达式确实返回一个位置,你想要结肠来就在那个位置之前。