我正在处理一个问题,在这个问题中,我得到了一个包含多组括号的字符串。
前任。"(024025026027028),(029030031032033)"
当我得到字符串时,我有一个变量,里面有一个字符串,比如"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"));
返回"024025026027028"
但是:
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"));
返回:"024025026027028),(029030031032033"
我指定?
是为了尽量减少在parens之间捕获的内容,但它似乎不起作用。有人能解释一下我缺了什么吗?
这是一个JSFiddlehttp://jsfiddle.net/rdwAP/#&togetherjs=xVQ7Ltd8rO
当您想从字符串中提取数据时,通常是个好主意
- 避免模糊、包罗万象或否定的模式
- 使用
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]);
请注意,在垃圾输入的情况下,这个显式正则表达式也会失败,这通常被认为是一个优点。
不要在正则表达式中使用.*?
,而是使用否定模式:
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
变量