匹配不在另一个字符串后的字符串

时间:2014-01-25 03:50:28

标签: javascript regex

var re = /[^<a]b/; 
var str = "<a>b";

console.log(str.match(re)[0]);

匹配>b

但是,我不明白为什么这种模式/[^<a>]b/与任何东西都不匹配。我想只捕获&#34; b&#34;。

4 个答案:

答案 0 :(得分:2)

/[^<a>]b/无法执行任何操作的原因是您忽略<a>个别字符,所以将其重写为/[^><a]b/也会做同样的事情。我怀疑这是你想要的。请尝试以下方法:

var re = /<a>(b)/; 
var str = "<a>b";

console.log(str.match(re)[1]);

此正则表达式首先查找看起来像<a>b的字符串,但它会用括号捕获b。要访问b,只需在拨打[1]而不是.match时使用[0],这将返回整个字符串(<a>b)。

答案 1 :(得分:2)

您在此处使用的是b匹配,前面是未在该组中列出的任何字符。语法[^a-z+-],其中a-z+-是一系列字符(在本例中,是小写拉丁字母的范围,加号和减号)。因此,您的正则表达式模式匹配的是任何b前面有非<a的字符。由于>不属于该范围,因此与之匹配。

范围选择器基本上与由OR管道分隔的字符列表相同:[abcd](a|b|c|d)匹配。范围选择器只有一个额外的功能,通过[a-d]匹配相同的字符串,在字符范围之间使用短划线。将^置于范围的开头会自动将此正范围选择器转换为负范围选择器,因此它将匹配该范围内的任何字符。

您正在寻找的是一种消极的向前看。那些可以排除匹配较长字符串的东西。这些工作采用以下格式:(?!do not match)其中do not match使用正常的正则表达式语法。在这种情况下,您要测试前面的字符串是否与<a>不匹配,所以只需使用:

(?!<a>)(.{3}|^.{0,2})b

b前面有三个不是<a>的字符,或者更少的字符位于该行的开头时,它将匹配(?<!<a>)b

PS:你可能正在寻找的是“负面的背后隐藏”,这在JavaScript正则表达式中是不可用的。其他语言的工作方式是{{1}}。因为JavaScript没有负面的lookbehinds,所以你必须使用这个替代正则表达式。

答案 2 :(得分:0)

您可以编写一个匹配锚标记的模式,然后将其替换为空字符串

var str = "<a>b</a>";    
str = str.replace(/((<a[\w\s=\[\]\'\"\-]*>)|</a>)/gi,'')

这将用'b'

替换以下字符串
<a>b</a>
<a class='link-l3'>b</a>

为了更好地熟悉regEx模式,您可能会发现此网站非常有用regExPal

答案 3 :(得分:-1)

您的代码:

var re = /[^<a>]b/; 
var str = "<a>b";
console.log(str.match(re));

为什么[^<a>]b与任何内容都不匹配?

[^<a>]b的含义是除<a>然后b之外的任何字符。

听到b之后是>,因此不匹配。

如果你想匹配b,那么你需要这样给出:

var re = /(?:[\<a\>])(b)/; 
var str = "<a>b";    
console.log(str.match(re)[1]);

<强> DEMO And EXPLANATION