正则表达式在C#中工作正常但在Javascript中没有

时间:2014-01-11 19:56:02

标签: javascript regex

我有以下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#中运行良好。

知道为什么会这样吗?

谢谢你, 米格尔

3 个答案:

答案 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);