需要一个找到“string”而不是“[string]”的正则表达式

时间:2013-03-19 19:14:44

标签: javascript jquery regex

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

这样的东西
string = "A bc defg hi [hi] jkl mnop.";

.match()应该返回“hi”而不是[hi]。我花了5个小时跑过RE的,但我还是扯着。

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

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

编辑:

好的,我刚刚有一个尤里卡时刻,并发现我使用的原始RegExp确实有效。但是当我用[匹配]替换匹配时,它只是替换了字符串中的第一个匹配...一遍又一遍。我认为这是我的正则表达式,拒绝跳过括号,但经过大量时间尝试下面的几乎所有解决方案后,我意识到我正在努力钻取Hardcore。

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

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

这使得它停止定位字符串中的原始单词并停止为每个匹配添加一组新的括号。感谢大家的帮助。我打算回答那些在正确的方向上刺激我的帖子。

7 个答案:

答案 0 :(得分:3)

在尝试匹配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, "")

答案 1 :(得分:1)

您不一定需要正则表达式。只需使用字符串操作:

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("]");
}

答案 2 :(得分:1)

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

hi(?!])

作为一个例子。

在这里看一下负向前瞻:http://www.regular-expressions.info/lookaround.html 不幸的是,javascript不支持负面的lookbehind。

我使用http://regexpal.com/来测试abcd[hi]jkhilmnop作为测试数据,hi(?!])作为要查找的正则表达式。它匹配'hi'而不匹配'[hi]'。基本上它只匹配'hi',只要没有跟随']'字符。

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

答案 3 :(得分:0)

r"\[(.*)\]"

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

答案 4 :(得分:0)

这将构建[]:

中包含的所有字符串的数组
var regex = /\[([^\]]*)\]/;
var string = "A bc defg hi [hi] [jkl] mnop.";
var results=[], result;
while(result = regex.exec(string))
    results.push(result[1]);

修改

要回答这个问题,这个正则表达式返回字符串少于[]的所有内容,并修剪空格:

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

答案 5 :(得分:0)

你想用它做什么?如果你想有选择地更换像“hi”这样的部件,除非它是“[hi]”,那么我经常使用一个系统来匹配我想要先避开的东西,然后我要看的东西;如果它与我想要避免的匹配,那么我返回匹配,否则我返回已处理的匹配。

像这样:

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

,使用给定的字符串返回:

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

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

答案 6 :(得分:0)

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

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.",其中空格不变。 您可以使用此代码尝试不同的事情,例如替换等。