2

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

就像是

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

.match() 应该返回“hi”而不是 [hi]。我已经花了 5 个小时在 RE 中运行,但我认输了。

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

任何帮助表示赞赏。我也在努力让我的问题格式正确:)

编辑:

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

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

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

这让它停止定位字符串中的原始单词,并停止在每次匹配时为其添加一组新的括号。感谢大家的帮助。我将把答案归功于那个促使我朝着正确方向前进的帖子。

4

7 回答 7

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, "")
于 2013-03-19T19:24:01.560 回答
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("]");
}
于 2013-03-19T19:18:15.977 回答
1

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

hi(?!])

举个例子。

看看这里关于负前瞻:http ://www.regular-expressions.info/lookaround.html 不幸的是,javascript 不支持负后瞻。

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

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

于 2013-03-19T19:27:32.097 回答
0
r"\[(.*)\]"

如果您想使用正则表达式,只需尝试一下即可。

于 2013-03-19T19:22:20.730 回答
0

这将构建 [ ] 中包含的所有字符串的数组:

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')
于 2013-03-19T19:31:52.150 回答
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 不为空)。

于 2013-03-19T19:45:40.253 回答
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."完整的空格。您可以使用此代码尝试不同的事情,例如替换等。

于 2013-03-19T22:26:54.580 回答