var re = /[^<a]b/;
var str = "<a>b";
console.log(str.match(re)[0]);
比赛>b
后不匹配的字符串。
但是,我不明白为什么这种模式/[^<a>]b/
不匹配任何东西。我只想捕捉“b”。
var re = /[^<a]b/;
var str = "<a>b";
console.log(str.match(re)[0]);
比赛>b
后不匹配的字符串。
但是,我不明白为什么这种模式/[^<a>]b/
不匹配任何东西。我只想捕捉“b”。
为什么/[^<a>]b/
什么都不做的原因是,你忽略<
,a
,并且>
为单个字符,所以重写它作为/[^><a]b/
会做同样的事情。不过,我怀疑这是你想要的。请尝试以下操作:
var re = /<a>(b)/;
var str = "<a>b";
console.log(str.match(re)[1]);
此正则表达式查找,看起来像<a>b
第一个字符串,但它抓住了b
用括号。要访问b
,只需在拨打.match
而不是[0]
时简单地使用[1]
,这将返回整个字符串(<a>b
)。
好的,谢谢。但我不想使用这样的捕捉。我想了解如何使用否定字符来匹配它。 – 1252748
您在此处使用的是匹配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>
,或者更少的字符开头这是在线的开始。
PS:您可能在寻找的是“负面后顾之忧”,这在JavaScript正则表达式中可惜。在其他语言中工作的方式是(?<!<a>)b
。因为JavaScript没有负向后顾之忧,所以你必须使用这个替代正则表达式。
你可以写一个模式来匹配锚标记,然后用空字符串替换
var str = "<a>b</a>";
str = str.replace(/((<a[\w\s=\[\]\'\"\-]*>)|</a>)/gi,'')
这将替换“B”下列字符串
<a>b</a>
<a class='link-l3'>b</a>
更好地熟悉正则表达式模式您可能觉得这个网站非常有用regExPal
您的代码:
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]);
'[^ ] B'会尝试匹配1个字符,是不是<, a, or >和然后ab字符,因为<,a,>都在b之前没有任何匹配。如果你尝试匹配的字符串是' kb',那么你会得到一个匹配。 –
提醒一下:不要指望用正则表达式来解析HTML代码。它已经被尝试了不止一次,并且在任何实际的接受中都不起作用。 你会设法调整一些孤立的模式,但只要你想匹配打开和关闭标签或嵌入元素,它会失败。 –
@kuroineko我知道。这只是我为乐趣而做的regex101测验的一部分。 – 1252748