2012-08-10 57 views
191

我需要有關非貪心選項的正則表達式匹配方面的幫助。如何編寫匹配非貪婪的正則表達式?

匹配模式是:

<img\s.*> 

的文本匹配是:

<html> 
<img src="test"> 
abc 
<img 
    src="a" src='a' a=b> 
</html> 

我測試的http://regexpal.com

這個表達式中的所有文本匹配從<img持續>。我需要它匹配第一次遇到>後最初<img,所以在這裏我需要得到兩場比賽,而不是我得到的。

我試過非貪心?的所有組合,沒有成功。

+5

你在REGEX中運行什麼語言? – Utkanos 2012-08-10 09:41:56

+0

[RegEx match open tags not except XHTML self-contained tags]可能的重複(https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) – 2017-12-18 22:26:39

回答

278

非貪心?工作得很好。這只是你需要選擇點匹配所有選項在正則表達式引擎(regexpal,你使用的引擎,也有這個選項),你正在測試。這是因爲,當您使用.時,正則表達式引擎通常不匹配換行符。您需要明確地告訴他們,要與.

例如太匹配換行符,

<img\s.*?> 

工作正常!

檢查results here

此外,閱讀有關how dot behaves在各種正則表達式口味。

+12

有你也可以這樣做:因爲\ s表示「任何空白」,而「\ S」表示「任何非空白」,[\ s \ S]將匹配任何字符(如「。」,但包括新線)!同樣,您可以使用[\ d \ D]或[\ w \ W]。這可能是相當方便的一點「黑客攻擊」,它肯定是一個非常有用的技巧,需要注意。 – 2014-11-21 11:45:51

+3

甚至在本例中,您可以使用:'] *>'來實現相同的效果:因爲「除了'>'」以外的任何字符都會包含新行! – 2014-11-21 11:52:54

+1

很好的答案,但如何bash?回聲「 bla 」| grep -P''匹配整個字符串,儘管?運營商。 – 2015-03-22 08:47:48

47

?操作數使匹配非貪婪。例如。 .*是貪婪的,而.*?不是。所以你可以使用像<img.*?>這樣的東西來匹配整個標籤。或者<img[^>]*>

但請記住,整組HTML不能用正則表達式實際分析。

+3

您的回答提醒了我:http://stackoverflow.com/a/1732454/431 – 2016-11-11 14:03:10

+2

我認爲這更清楚地說' ?'是'*'的非貪婪版本。 – golopot 2016-11-12 01:34:02