Javascript中的正则表达式匹配返回原始字符串

时间:2014-04-11 06:39:52

标签: javascript regex

我尝试使用Javascript Regex以这种方式选择内容:!something: somethingelse;感叹号,冒号和分号必须在那里,但其他部分可以是任何值。我试图这样做:

"!test: value; random text here !another: valueagain;".match(/!(.*):(.*);/g);

这将返回原始字符串!test: value; random text here !another: valueagain;。我有什么不正确的做法,还是正则表达式不正确?

4 个答案:

答案 0 :(得分:2)

正如devnull建议的那样,使用非贪婪的量词。

"!test: value; random text here !another: valueagain;".match(/!(.*?):(.*?);/g);

输出:

 [ '!test: value;', '!another: valueagain;' ]

一般来说,像*这样的正则表达式量词是 greedy ,因为它们会尝试匹配尽可能大的表达式。

非贪婪版本*?只会匹配所需的匹配项。

答案 1 :(得分:1)

你正在使用贪婪的匹配器,使用像这样的非贪婪的匹配器

"!test: value; random text here !another: valueagain;".match(/!(.*?):(.*?);/g);
# [ '!test: value;', '!another: valueagain;' ]

(.*):消耗所有内容直到字符串中的最后一个:,因为它是贪婪的。这就是为什么你只得到一个字符串。使用?就像使用此.*?一样,让它变得非贪婪。这可以确保它匹配到第一个:

Regular expression visualization

Debuggex Demo

答案 2 :(得分:0)

试试这个:

.match(/!(.*?):(.*?);/g);

添加的问号使*非贪婪,这意味着它匹配尽可能短的字符串。

答案 3 :(得分:0)

试试这个表达式:

"!test: value; random text here !another: valueagain;".match(/![^!]*:[^!]*;/g);

返回:

["!test: value;", "!another: valueagain;"]