我尝试使用Javascript Regex以这种方式选择内容:!something: somethingelse;
感叹号,冒号和分号必须在那里,但其他部分可以是任何值。我试图这样做:
"!test: value; random text here !another: valueagain;".match(/!(.*):(.*);/g);
这将返回原始字符串!test: value; random text here !another: valueagain;
。我有什么不正确的做法,还是正则表达式不正确?
答案 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;' ]
(.*):
消耗所有内容直到字符串中的最后一个:
,因为它是贪婪的。这就是为什么你只得到一个字符串。使用?
就像使用此.*?
一样,让它变得非贪婪。这可以确保它匹配到第一个:
。
答案 2 :(得分:0)
试试这个:
.match(/!(.*?):(.*?);/g);
添加的问号使*
非贪婪,这意味着它匹配尽可能短的字符串。
答案 3 :(得分:0)
试试这个表达式:
"!test: value; random text here !another: valueagain;".match(/![^!]*:[^!]*;/g);
返回:
["!test: value;", "!another: valueagain;"]