2011-09-25 149 views
7

我有一些HTML代碼中的字符串,例如:如何使用RegEx搜索雙引號包圍的文本?

This is <strong id="c1-id-8">some</strong> <em id="c1-id-9">text</em> 

我需要去掉從每一個HTML標籤的id屬性,但我有一個正則表達式零的經驗,所以我搜索在這裏和那裏從互聯網上,我寫了這種模式:[\s]+id=\".*\"

不幸的是,它不工作,因爲我期望。事實上,我希望正則表達式能夠捕獲id=",隨後是任何重複任意次數的字符,並以最接近的雙引號結尾;實際上,在這個例子中,我期待趕上id="c1-id-8"id="c1-id-9"。 但是,模式返回了子字符串id="c1-id-8">some</strong> <em id="c1-id-9",它發現id="的第一個匹配項和最後一個雙引號字符。

你能告訴我我的模式有什麼問題,請問該如何解決? 非常感謝你

+2

爲∞個時間,**使用解析器** HTML是不是一個正規的語言 –

回答

10

在你的正則表達式中的量詞.*貪婪(意思是它匹配儘可能多)。爲了符合最低要求,你可以使用類似/\s+id=\"[^\"]*\"/的東西。括號[]表示一個字符類。所以它將匹配括號內的所有內容。字符類開頭的克拉[^]是否定,意思是它將匹配的所有內容,除了括號內指定的內容

另一種方法是告訴.*量詞,改成.*?將盡可能少的,因爲它可以匹配是

+0

非常感謝你,現在我明白它是如何工作的:(1)它通過搜索任意數量的空格+ id =「(2)它搜索任何字符,直到找到雙引號字符(3)它搜索雙引號char – Cesco

+1

正確和出色的問題,並在發佈之前研究你的問題,這總是有幫助 – nachito

+0

@ridgerunner很好的說明/更正我編輯了我的答案,希望更準確 – nachito

0

如果你知道你的id總是7個字符,你可以這樣做。

/\sid=".{7}"/g 

所以..

var a = 'This is <strong id="c1-id-8">some</strong> <em id="c1-id-9">text</em>'; 

var b = a.replace(/\sid=".{7}"/g, ''); 

document.write(b); 

例子:http://jsfiddle.net/jasongennaro/XPMze/

檢查檢查看id小號刪除。

+0

非常感謝您Unfort。一個ID字符串可以是任何長度,我無法控制它:-( – Cesco

+0

沒有問題@Cesco。樂意效勞。 –

+0

誰低估了這一點。我不介意downvote,但你能告訴我爲什麼? –

3

.*星號是一個貪婪的量詞和儘可能多的字符相匹配,因爲它可以,所以它只能停在最後"找到。

您可以使用".*?"使其懶惰,或(更好IMO),使用"[^"]*"進行匹配明確:

"  # match a quote 
[^"]* # match any number of characters except quotes 
"  # match a quote 

您可能還需要逃避引號,如果你正在構建的正則表達式從一個字符串;否則這是沒有必要的,因爲引號在正則表達式中不是特殊字符。

+0

謝謝你很詳細的解釋 – Cesco

1

解析器是一般情況下的最佳解決方案,但他們需要時間來編寫。有些情況下,編寫一個會比解析器節省更多的時間;也許這是一個時間。

你想要的是一個非貪婪的比賽或一個更精確的比賽。/[\ s] + id = \「。?\」/ will do the trick,but [\ s] + id = \「[^」] \「會更快。正則表達式考慮到引號字符的可能性,允許使用單引號而不使用雙引號,並且允許完全沒有引號會更加複雜。在這一點上,您確實需要解析器。

+0

非常感謝你 – Cesco

1

示例grep的:(但有一點是表達)

kent$ echo 'This is <strong id="c1-id-8">some</strong> <em id="c1-id-9">text</em>'|grep -oP '(?<= id=")[^"]*(?=">)' 
c1-id-8 
c1-id-9 
+0

謝謝你的這個例子 – Cesco