我有以下javascript代码:
var markdown = "I have \(x=1\) and \(y=2\) and even \[z=3\]"
var latexRegex = new RegExp("\\\[.*\\\]|\\\(.*\\\)");
var matches = latexRegex.exec(markdown);
alert(matches[0]);
匹配只匹配[0] =“x = 1和y = 2”,应该是:
matches[0] = "\(x=1\)"
matches[1] = "\(y=2\)"
matches[2] = "\[z=3\]"
但是这个正则表达式在C#中运行良好。
知道为什么会这样吗?
谢谢你, 米格尔
答案 0 :(得分:2)
g
标志以多次匹配。
/.../
),您无需转义\
。*
贪婪地匹配。使用非贪婪版本:*?
var markdown = "I have \(x=1\) and \(y=2\) and even \[z=3\]"
var latexRegex = /\[.*?\]|\(.*?\)/g;
var matches = markdown.match(latexRegex);
matches // => ["(x=1)", "(y=2)", "[z=3]"]
答案 1 :(得分:0)
尝试使用match
功能代替exec
功能。 exec
仅返回它找到的第一个字符串,如果设置了全局标志,则match
将全部返回。
var markdown = "I have \(x=1\) and \(y=2\) and even \[z=3\]";
var latexRegex = new RegExp("\\\[.*\\\]|\\\(.*\\\)", "g");
var matches = markdown.match(latexRegex);
alert(matches[0]);
alert(matches[1]);
如果您不想将\(x=1\) and \(y=2\)
作为匹配项,则需要使用非贪婪的运算符(*?
)而不是贪婪的运算符(*
)。您的RegExp将成为:
var latexRegex = new RegExp("\\\[.*?\\\]|\\\(.*?\\\)");
答案 2 :(得分:0)
尝试非贪婪:\\\[.*?\\\]|\\\(.*?\\\)
。如果使用.exec()
方法,您还需要使用循环:
var res, matches = [], string = 'I have \(x=1\) and \(y=2\) and even \[z=3\]';
var exp = new RegExp('\\\[.*?\\\]|\\\(.*?\\\)', 'g');
while (res = exp.exec(string)) {
matches.push(res[0]);
}
console.log(matches);