寫這個的初衷是因為專案中要為struts的html標籤加上styleid屬性,其屬性值一般與property屬性值相同。由於頁面很多手工修改很可能會出差錯工作量也很大,雖然這項工作不是由我來做,但是我建議可以用正規表示式替換來做,可以簡單很多。寫正規表示式的任何就落在我的頭上了,這個正規表示式不會很簡單,我需要能夠快速的測試正規表示式。而且eclipse或ultraedit等工具一般只接受單行正規表示式,不接受帶注釋的正規表示式,但是在開發過程中使用帶注釋的正規表示式是很重要的,將所有的正規表示式寫在一行,一旦正規表示式太長很容易把自己搞糊塗,因此我需要將帶注釋的正規表示式轉化成單行的不帶注釋的正規表示式。
要匹配乙個簡單的屬性,屬性包括屬性名或屬性值,屬性值可以包含在單引號或雙引號中:
\w+\s*=\s*"[^"]*"|'[^']*'不幸的是它不能正確匹配:property="<%="prop"+i%>",因此要匹配乙個屬性:
\w+\s*=\s*(?:"<%=(?:[^%]*|[^>]*)%>"|"[^"]*"|'[^']*')(?:)表示不捕獲該組。
匹配標籤的開始部分,(?!\s+styleid),向前負匹配,表示如果已經存在styleid屬性就不用替換了
匹配property屬性之前或之後的部分:匹配property屬性:(?:\s+\w+\s*=\s*(?:"<%=(?:[^%]*|[^>]*)%>"|"[^"]*"|'[^']*')(?!\s+styleid))*
property\s*=\s*("<%=(?:[^%]*|[^>]*)%>"|"[^"]*"|'[^']*')(?!\s+styleid)最終結果:
( # 捕捉property屬性之前的所有部分,用於替換將它轉換成不帶注釋的正規表示式:]*)%>"|"[^"]*"|'[^']*')(?!\s+styleid))* #property屬性之前的屬性
\s+ #屬性之間的空格
property\s*=\s*("<%=(?:[^%]*|[^>]*)%>"|"[^"]*"|'[^']*')(?!\s+styleid) #property屬性
)( # 捕捉property屬性之後的所有部分,用於替換
(?:\s+\w+\s*=\s*(?:"<%=(?:[^%]*|[^>]*)%>"|"[^"]*"|'[^']*')(?!\s+styleid))* #property屬性之後的屬性
\s* #開始標籤結尾部分可選的空格
(?:/>|>)
)
*"|'[^']*')(?!\s+styleid))*\s+property\s*=\s*("<%=(?:[^%]*|[^>]*)%>"|"[^"]*"|'[^']*')(?!\s+styleid))((?:\s+\w+\s*=\s*(?:"<%=(?:[^%]*|[^>]*)%>"|"[^"]*"|'[^']*')(?!\s+styleid))*\s*(?:/>|>))替換表示式為: $1 styleid=$3$4
測試輸入:
text" other=""/>
"/>
text" styleid="<%="citation[" + index +"].displayflag"%>" other=""/>
" styleid="<%="citation[" + index +"].displayflag"%>"/>
正規表示式及測試工具
1.正規表示式 正規表示式 一種匹配文字中的字串行的字元模式。在很多文字編輯器或其他工具裡,正規表示式通常被用來檢索或替換那些符合某種模式的文字內容。許多程式語言都支援利用正規表示式進行字串操作。乙個正規表示式就是由普通字元 例如字元 a 到 z 以及特殊字元 稱為元字元 組成的文字模式。該模式描述...
寫了乙個測試正規表示式的小工具
由於需要反覆的檢驗試用正規表示式,用得比較頻繁。用expresso的時候,每次改了一下之後都需要點那個測試的按鈕,再把匹配結果樹點開檢視是否正確。不能實時顯示結果,往往需要測試多遍才能得到需要的表示式。expresso的介面不是很靈活,調整起來不大方便。這幾個問題其實目前所有的正規表示式工具都有,所...
正規表示式工具
python類庫31 正規表示式匹配例項 一 regex match tracer 1 不能是某些字元中之一 用來表示匹配多個字元之一。與相反,表示匹配與多個字元中的任乙個都不匹配。下圖中,h是第乙個與abcd都不匹配的字元。2 匹配多個字串中的2個或者乙個匹配2次 用來表示多個字串中的乙個。用來表...