找到一个由方括号括起来的字符串,*不是*以特定字符开头

时间:2016-01-08 14:27:58

标签: javascript regex

我希望与

匹配
  

IdentityResult result = await this.UserManager.CreateAsync(user, model.Password);

但不是

  

[testing]

这是我查询方括号包围的字符串: ![testing]

\[([^\]]+)\]

它的工作非常出色。 但是,我在http://regexr.com/上花了半个小时试图用“!”跳过字符串。在前面,但不能。

编辑:我很抱歉,我没有意识到某些操作无法得到特定口译员的支持。我用Javascript编写,显然不支持lookbehind,我收到此错误:

  

Uncaught SyntaxError:无效的正则表达式:   /(?

抱歉浪费时间:\

3 个答案:

答案 0 :(得分:2)

您可以使用替换:

(?:^|[^!])(\[[^\]]+\])

RegEx Demo

此处(?:^|[^!])将匹配输入的开头或任何非!

的字符

<强>代码:

var re = /(?:^|[^!])(\[[^\]]+\])/gm;
var str = '![foobar123]\n[xyz789]';
while ((m = re.exec(str)) !== null)
    console.log(m[1]);

<强>输出:

[xyz789]

答案 1 :(得分:1)

在Javascript中,不支持lookbehinds,您可以使用:

^[^!]*\[([^\]]+)\]

(使用多行标志来匹配每一行的开头)

regexr.com上查看。

这是来自debuggex.com的可视化:

Regular expression visualization

答案 2 :(得分:1)

您可以使用捕获

&#13;
&#13;
var re = /(?:^|[^!])(\[[^[\]]*])/g; 
var str = '[goodtesting] ![badtesting] ';
var m;
 
while ((m = re.exec(str)) !== null) {
    document.getElementById("r").innerHTML += m[1] + "<br/>";
}
&#13;
<div id="r"/>
&#13;
&#13;
&#13;

(?:^|[^!])(\[[^[\]]*])正则表达式匹配字符串的开头或!以外的任何字符(非捕获组(?:^|[^!]))和匹配和捕获[]括起来的子字符串,里面没有[](\[[^[\]]*]))。当我们需要获得多个匹配时,我们需要使用RegExp#exec()并使用索引(此处为索引1)访问捕获的组。

另外,在JS中,当你不需要检查匹配后的内容时,只需要一个没有前瞻的后视,你可以使用反向字符串技术(使用反向字符串的前瞻):

&#13;
&#13;
function revStr(s) {
    return s.split('').reverse().join('');
}
var re = /][^[\]]*\[(?!!)/g;  // Here, the regex pattern is reverse, too
var str = '![badtesting] [goodtesting]';
var m;

while ((m = re.exec(revStr(str))) !== null) {  // We reverse a string here
  document.getElementById("res").innerHTML += revStr(m[0]); // and the matched value here
}
&#13;
<div id="res"/>
&#13;
&#13;
&#13;

对于较长的模式,这是不可能的,但这个模型看起来很简单。