2014-01-25 64 views

回答

2

为什么/[^<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)。

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>,或者更少的字符开头这是在线的开始。

PS:您可能在寻找的是“负面后顾之忧”,这在JavaScript正则表达式中可惜。在其他语言中工作的方式是(?<!<a>)b。因为JavaScript没有负向后顾之忧,所以你必须使用这个替代正则表达式。

0

你可以写一个模式来匹配锚标记,然后用空字符串替换

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

这将替换“B”下列字符串

<a>b</a> 
<a class='link-l3'>b</a> 

更好地熟悉正则表达式模式您可能觉得这个网站非常有用regExPal

-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

+0

你为什么要逃脱'<' and '>'? – Toto

+0

@ M42:[>]表示列表中的单个字符> –

+0

我不明白,您为什么用正斜杠替换反斜杠?你现在已经摆脱了正斜线。 – Toto

相关问题