2011-10-04 164 views
0

我有以下代码:正则表达式和正则表达式的特殊字符在JavaScript

var html = "<div class='test'><b>Hello</b> <i>world!</i></div>"; 
var results = html.match(/<(\/?) (\w+) ([^>]*?)>/); 

关于三套括号:

首先意味着:斜杠或没有。

第二种意思是:一个或多个字母数字字符。

第三种意思是:除了'>'之外的任何东西,那么我不明白'*?' !

另外我该如何解释有三组圆括号用空格分隔的事实?

问候,

+0

我觉得'?'在这种情况下是多余的,因为你已经有'*'。 – user278064

+0

user278064:'*?'是一个懒惰的量词,匹配尽可能少,同时仍然确保正则表达式匹配。 – Joey

回答

1

的星号(*)指零次或多次匹配前一比特。前面的位是[^>],这意味着除>以外的任何内容。正如@ user278064所说,?是多余的。它的目的是使*非贪婪,但没有必要,因为[^>]已经指定了什么*应参考。 (你可以取代[^>].(句号/期),这将匹配任何字符,则?将确保它匹配任何东西,直到>

至于空间,他们不应该在那里。 ..他们字面上匹配的空间,我不认为你想要的。

2

*手段“匹配尽可能”(可能是零字符)前面定义的文字的,
?意味着:匹配刚够使得正则表达式返回匹配。

实施例:

String: 
Tester> 

[^>]* 
Tester 

[^>]*? 
<empty string> 

[^>]*e 
Teste 

[^>]*?e 
Te (Including T is required to produce a valid match) 

情况:

String: 
<input value=">"> junk 

[^>]*> 
<input value=">"> 

[^>]*?> 
<input value="> 
0

*? in regex是一个“懒惰的明星”。

星号表示“重复上一个零点或零点以上”。本例中的前一个项目是一个字符类,它定义“除>之外的任何字符”。

默认情况下,恒星本身是“贪婪的”,这意味着它将尽可能匹配尽可能多的字符,同时仍然满足其周围其余表达式的条件。

通过添加问号将其更改为懒惰的星星意味着它将尽可能地匹配尽可能少的字符,同时仍然满足其余条件。

对于您的表情,这实际上对实际结果没有任何影响,因为您在星号为>后立即匹配的字符与之前的匹配完全相反。这意味着表达式总是与[^>]*的结果匹配,无论它是懒惰还是贪婪。

在其他正则表达式中,区别更重要,因为贪婪表达式可能会吞下部分字符串,否则该字符串会在表达式中以后匹配。

但是,尽管结果可能没有区别,但贪婪表达式和延迟表达式之间可能仍存在差异,因为它们处理的不同方式可能会导致表达式以不同的速度运行。再次,我认为你的情况不会有太大的不同,但在某些情况下,它会产生很大的影响。

我推荐在http://www.regular-expressions.info/上阅读正则表达式 - 它有一个很好的参考表,用于您可能需要的所有正则表达式语法,以及关于许多困难主题的文章。