2011-10-04 247 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/上閱讀正則表達式 - 它有一個很好的參考表,用於您可能需要的所有正則表達式語法,以及關於許多困難主題的文章。