我正在研究一个问题,我得到一个包含几组括号的字符串。
离。 "(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
答案 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
组中存在的(...)
变量。