2010-03-11 25 views
2

我想完成什麼這個(無效我相信)的正則表達式試圖做的事:匹配任何東西,除了一個子模式

<p><a>([^(<\/a>)]+?)<\/a></p>uniquestring 

基本上匹配除了關閉錨標記任何東西。簡單的非貪婪沒有幫助,因爲`uniquestring」很可能是另一個遙遠的結束錨標記後:

<p><a>text I don't <tag>want</tag> to match</a></p>random 
data<p><a>text I do <tag>want to</tag> match</a></p>uniquestring more 
matches <p><a>of <tag>text I do</tag> want to match</a></p>uniquestring 

所以我得在錨標記之間更多的標籤。我使用uniquestring的存在來確定我是否想要匹配數據。所以一個簡單的非貪婪最終會匹配從我不想要的數據開始到我想要的數據結束的所有事物。

我知道我越來越接近正則表達式的問題(或者至少我的知識)不善於解決。我只能通過HTML/XML解析器中的數據,但它只是一個簡單的(ish)搜索。

有沒有一些簡單的方法來做到這一點,我只是想念?

回答

1

您正在尋找零寬度負向後看:

<p><a>((?<!<\/a>).)+<\/a><\/p>uniquestring 

測試:

(zyx:~) % echo $T 
<p><a>text I don't <tag>want</tag> to match</a></p>random data<p><a>text I do <tag>want to</tag> match</a></p>uniquestring more matches <p><a>of <tag>text I do</tag> want to match</a></p>uniquestring 
(zyx:~) % echo $T | grep -oP '<p><a>((?<!<\/a>).)+<\/a><\/p>uniquestring' 
<p><a>text I do <tag>want to</tag> match</a></p>uniquestring 
<p><a>of <tag>text I do</tag> want to match</a></p>uniquestring 
+0

事實上,這就是我一直在尋找!我幾乎可以理解它。 :-) – 2010-03-11 19:26:20

+0

我會使用* lookahead *,而不是後視。你的方式,它必須通過''序列,纔會意識到它不應該匹配它。 '(?!<\/a>)'在第一個字符停止匹配。 – 2010-03-11 23:56:33

相關問題