此
var re = /[^<a]b/;
var str = "<a>b";
console.log(str.match(re)[0]);
匹配>b
。
但是,我不明白为什么这种模式/[^<a>]b/
与任何东西都不匹配。我想只捕获&#34; b&#34;。
答案 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 强>