2011-08-25 103 views
0

我有幾個正則表達式拍下來,但我內CFEclipse努力釘其中發現的不同語法:基於正則表達式搜索

CFQUERY的所有實例標記,包含屬性

我已經試過

<cfquery [^>]*(?!(name=))[^>]*> 

其中我已經打算陷阱:

cfquery標籤,隨後任意數量的字符不在閉合>NOT接着名稱屬性,隨後通過任何數量的不是結束的字符>,然後結束>

此找到很多的比賽,其中一些含有一些屬性不(因此它顯然是不正確)。

任何人都可以用這根線索打我嗎?謝謝!

回答

2

看起來你應該使用這個XML解析器,但你的問題是[^>]*是貪婪的,如果它存在將匹配通過屬性。你需要的東西像下面這樣:

<cfquery (?![^>]*name=)[^>]*> 

通過移動[^>]*進入負前瞻,你可以確保「NAME =」沒有在字符串中的下>之前就已存在。

+0

XML解析器不能針對CFML。 理想情況下,他需要的是一個CFML解析器/分析器,但這不是一件容易的事情。 :(另外,你的lookahead只是針對第一個'[^>]'角色,而不是所有的角色。 –

+0

@Peter Boughton - 我的正則表達式工作正常,http://www.rubular.com/r/4O2jzXd0oO - 謝謝對於關於CFML的評論,我不太熟悉它 –

+0

對不起,我誤解了你正在做的事,是的,它確實有效(儘管我仍然可以從我在答案的第二部分提到的單詞邊界中受益,所以'] * \ bname \ s * =)[^>] *>') –

1

如果你希望你的先行反對每個字符行事,直到開始標記的結束,你需要拆分的字符類和量詞,像這樣:

<cfquery\b(?:(?!name=)[^>])*> 

注意\b(字邊界)而不是空間 - 這將允許<cfquery>匹配(但仍阻擋<cfqueryparam...>標籤(\b後的字母數字字符,確保下一個字符非字母)

另外值得指出的是,在(?: ...。是一個非捕獲組 - 類似於正常的( ... )但由於我們不需要它,因此不會創建反向引用。

當然,這是不可能匹配正確 - 如果你有一個屬性notname或你有name = "whatever"這些都將被正確對待。

爲了解決這個問題,我們可以使用一個\b再次名稱之前這段時間,然後使用可選的\s允許(但不要求),屬性名和平等之間的任何空白簽名:

<cfquery\b(?:(?!\bname\s*+=)[^>])*> 

並且不要忘記確保啓用不區分大小寫的標誌,如果您可能在任何地方混合/大寫標籤/屬性。

+0

謝謝彼得。我很抱歉延遲迴到這個Q(已經過了一個月),但是很感謝你的回答,我必須閱讀關於文字的界限,才能完全正義!乾杯,艾丹。 –