需要一个正则表达式来查找";字符串";但不是";[string]"

Need a regex that finds "string" but not "[string]"

本文关键字:quot 字符串 string 查找 正则表达式 一个      更新时间:2023-09-26

我正在尝试构建一个正则表达式,该表达式解析字符串并跳过括号中的内容。

类似的东西

string = "A bc defg hi [hi] jkl mnop.";

.match((应返回"hi",但不应返回[hi]。我花了5个小时复习RE,但我还是认输了。

如果重要的话,这也适用于javascript或jquery。

感谢您的帮助。此外,我正在努力使我的问题格式正确:(

编辑:

好吧,我刚刚灵光一现,发现我使用的原始RegExp确实有效。但当我用[匹配]替换匹配时,它只是替换了字符串中的第一个匹配。。。一遍又一遍。我以为这是我的正则表达式拒绝跳过括号,但在尝试了下面几乎所有的解决方案之后,我意识到我正在对Hardcore进行降级。

当.replaces发挥其魔力时,它是在第一场比赛中,所以我很简单地在结果词的末尾添加了一个空格,如下所示:

var result = string.match(regex);
var modifiedResult = '[' + result[0].toString() + ']';
string.replace(result[0].toString() + ' ', modifiedResult + ' ');

这使得它不再针对字符串中的原始单词,并停止在每次匹配时向其添加一组新的括号。谢谢大家的帮助。我要感谢这篇促使我朝着正确方向前进的帖子。

在尝试匹配RE 之前,通过删除括号之间的所有内容来预处理目标字符串

string = "A bc defg hi [hi] jkl mnop."
tmpstring = string.replace(/'[.*']/, "")

然后将您的RE应用于tmpstring

更正:根据下面的nhahtd评论,匹配括号,并使RE全局

string = "A bc defg hi [hi] jkl mnop."
tmpstring = string.replace(/'[.*?']/g, "")

您不一定需要regex。简单使用字符串操作:

var arr = string.split("[");
var final = arr[0] + arr[1].split("]")[1];

如果有多个方括号表达式,请使用循环:

while (string.indexOf("[") != -1){
    var arr = string.split("[");
    string = arr[0] + arr.slice(1).join("[").split("]").slice(1).join("]");
}

仅使用正则表达式,就可以使用:

hi(?!])

作为一个例子。

看看这里的负面展望:http://www.regular-expressions.info/lookaround.html遗憾的是,javascript不支持反向查找。

我曾经http://regexpal.com/要测试,abcd[hi]jkhilmnop作为测试数据,hi(?!])作为要查找的正则表达式。它匹配了"嗨"而没有匹配"[嗨]"。基本上,只要没有后面的"]"字符,它就会匹配"hi"。

当然,如果需要,可以进行扩展。这样做的好处是不需要对字符串进行任何预处理。

r"'[(.*)']"

如果你想使用正则表达式的话,就可以试试这个。

您想用它做什么?如果你想选择性地更换像"嗨"这样的部件,除非是"[嗨]",那么我经常使用一个系统,先匹配我想避免的内容,然后匹配我想看的内容;如果它与我想要避免的匹配,那么我返回匹配,否则我返回已处理的匹配。

像这样:

return string.replace(/('['w+'])|('w+)/g, function(all, m1, m2) {return m1 || m2.toUpperCase()});

对于给定的字符串,返回:

"A BC DEFG HI [hi] JKL MNOP."

因此:它用大写字母替换每个单词(m1为空(,除非单词位于方括号之间(m1不为空(。

这构建了一个包含在[]中的所有字符串的数组:

var regex = /'[([^']]*)']/;
var string = "A bc defg hi [hi] [jkl] mnop.";
var results=[], result;
while(result = regex.exec(string))
    results.push(result[1]);

编辑

为了回答这个问题,这个正则表达式返回字符串less all is in[],并修剪空白:

"A bc defg [hi] mnop [jkl].".replace(/('s{0,1})'[[^']]*']('s{0,1})/g,'$1')

您可以尝试不同的方法,而不是跳过匹配-匹配所有内容,但不要捕获方括号(包括方括号(内的字符串,如下所示:

var r = /(?:'[.*?[^'[']]'])|(.)/g;
var result;
var str = [];
while((result = r.exec(s)) !== null){
  if(result[1] !== undefined){ //true if [string] matched but not captured
    str.push(result[1]);
  }
}
console.log(str.join(''));

最后一行将打印字符串中与[string]模式不匹配的部分。例如,当使用输入"A [bc] [defg] hi [hi] j[kl]u m[no]p."进行调用时,代码会打印带有空白的"A hi ju mp."。您可以使用此代码尝试不同的操作,例如替换等。