RegExp无法正常工作捕获parens中的字符串

时间:2016-04-04 11:45:46

标签: javascript regex

我正在研究一个问题,我得到一个包含几组括号的字符串。

离。 "(024,025,026,027,028),(029,030,031,032,033)"

当我得到字符串时,我有一个变量,拿着一个字符串说" 030"。我这样创建一个正则表达式:

var re = new RegExp(".*?\\((.*?" + id + ".*?)\\).*");

并按如下方式进行替换:

string.replace(re, "$1");

所以问题是,如果数字落在第一组括号内,那么它将正常工作,但如果它落在第二组内则不会。

这样:

var id = "024";   
var re = new RegExp(".*?\\((.*?" + id + ".*?)\\).*");
var string = "(024,025,026,027,028),(029,030,031,032,033)";
document.writeln(string.replace(re, "$1"));

返回" 024,025,026,027,028"

但:

var id = "029";   
var re = new RegExp(".*?\\((.*?" + id + ".*?)\\).*");
var string = "(024,025,026,027,028),(029,030,031,032,033)";
document.writeln(string.replace(re, "$1"));

返回:" 024,025,026,027,028),(029,030,031,032,033"

我指定?以最小化parens之间捕获的内容 - 但它似乎不起作用。有人可以解释我错过的东西吗?

这是一个JSFiddle http://jsfiddle.net/rdwAP/#&togetherjs=xVQ7Ltd8rO

2 个答案:

答案 0 :(得分:1)

如果要从字符串中提取数据,通常是个好主意

  • 避免模糊,包罗万象或否定的模式
  • 使用match代替replace

它更干净,更明确,更快。

在这里,您应该使用(\d+,)*(,\d+)*而不仅仅是.*?

var id = "029";   
var re = new RegExp("\\(((\\d+,)*" + id + "(,\\d+)*)\\)");
var string = "(024,025,026,027,028),(029,030,031,032,033)";
document.writeln(string.match(re)[1]);

请注意,在垃圾输入的情况下,这个显式正则表达式也会失败,这通常被视为加号。

答案 1 :(得分:1)

不要在你的正则表达式中使用.*?,而是使用否定模式:

var id = "029";   
var re = new RegExp("\\(([^)]*" + id + "[^)]*)\\)");
var string = "(024,025,026,027,028),(029,030,031,032,033)";
string.replace(re, "$1");
//=> "(024,025,026,027,028),029,030,031,032,033"
  • ([^)]*将匹配任何不是)的任何字符中的0个或更多字符,从而在获得)时停止匹配。
  • 当您拥有.*?时,它会匹配,直到找到第id组中存在的(...)变量。