RegExp在parens中捕获字符串时未按预期工作

RegExp not working as expected capturing strings within parens

本文关键字:工作 字符串 parens RegExp      更新时间:2023-12-20

我正在处理一个问题,在这个问题中,我得到了一个包含多组括号的字符串。

前任。"(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变量