專案中一次正規表示式的實踐

2021-08-30 06:54:59 字數 2504 閱讀 5534

今天在專案中遇到這樣乙個需求:

要求把一段html**中的注釋裡的某類表示式替換掉,而在注釋外的這類表示式不需要替換,例如:

其中,在注釋內的%(/images/a.jpg)要替換成$/images/a.jpg

替換後應該是這樣的:

經過一番研究,深入了解了一下greedy、reluctant和possessive這些量詞的區別(可以參考一下),以及special constructs (non-capturing)的作用(以前也沒對regex去太多研究,只用點簡單的),留下**,以供日後查閱

/*** replace special symbol in html comments, like ""

* @param text

* @return

*/protected string replacespecialsymbolincomments(string text) " + specialmatcher01.group(1));

int specialmatchstart01 = specialmatcher01.start();

int specialmatchend01 = specialmatcher01.end();

offset += ("$" + specialmatcher01.group(1)).length() - specialmatcher01.group(0).length();

sb.replace(commentmatchstart + specialmatchstart01, commentmatchstart + specialmatchend01, "");

sb.insert(commentmatchstart + specialmatchstart01, "$" + specialmatcher01.group(1));

}log.debug("temp result: " + sb.tostring());

}return sb.tostring();

}

附錄參考:引用

greedy、reluctant和possessive量詞的區別

greedy、reluctant和possessive量詞之間有微妙的區別。

但是,reluctant量詞採取相反的方式:它們從輸入字串的開頭開始,然後逐步地一次讀取乙個字元搜尋匹配。它們最後試圖匹配的內容是整個輸入字串。

最後,possessive量詞總是讀完整個輸入字串,嘗試一次(而且只有一次)匹配。和greedy量詞不同,possessive從不後退,即使這樣做能允許整體匹配成功。

為了演示,我們分析輸入字串xfoo******foo:

enter your regex: .*foo // greedy quantifier

enter input string to search: xfoo******foo

i found the text "xfoo******foo" starting at index 0 and ending at index 13.

enter your regex: .*?foo // reluctant quantifier

enter input string to search: xfoo******foo

i found the text "xfoo" starting at index 0 and ending at index 4.

i found the text "******foo" starting at index 4 and ending at index 13.

enter your regex: .*+foo // possessive quantifier

enter input string to search: xfoo******foo

no match found.

第乙個例子使用greedy量詞.*搜尋「任何內容」零次或者多次,後面是字母f、o、o。因為是greedy量詞,所以表示式的.*部分首先讀完整個字串。這樣,整個表示式不會成功,因為最後三個字母(「f」「o」「o」)已經被消耗了。所以匹配器緩慢地一次後退乙個字母,一直後退到最右側出現「foo」為止,這裡匹配成功並且搜尋停止。

但是第二個例子使用的量詞是reluctant量詞,所以它首先消耗「無內容」。因為「foo」沒有出現在字串的開頭,所以迫使它消耗掉第乙個字母(x),這樣就在索引0和4的位置觸發第乙個匹配。我們的測試示例繼續處理,直到輸入字串耗盡為止。它在索引4和13找到了另乙個匹配。

第三個例子找不到匹配,因為是possessive量詞。這種情況下,.*+消耗整個輸入字串,在表示式的結尾沒有剩下滿足「foo」的內容。possessive量詞用於處理所有內容,但是從不後退的情況;在沒有立即發現匹配的情況下,它的效能優於功能相同的greedy量詞。

記一次簡單的正規表示式匹配實踐

背景 由於需要對大促期間的 日誌進行降級,需要驗證保留下來的70多個pageid的頁面是否生效。如果使用常規手段,如果想要全量驗證,需要使用kafka收發資料的指令碼跑70 遍,想想就是一件很繁重很蠢的工作。這個時候想到使用python進行輔助驗證,即可以進行全量校驗,又能節省時間。思路 1.將所有...

正規表示式實踐

正規表示式通常用來檢索 替換符合匹配某個模式的文字。字元匹配 代表任意單個字元,乙個字母 數字或漢字等 代表指定範圍內的字元,abc 表示a,b,c 這3個字母中的任意乙個 表示排除 中的字元以外的字元 alnum 所有大小寫字母和數字,數量1 alpha 所有大小寫字母,數量1 blank 代表空...

實戰專案中的正規表示式運用

這裡是正規表示式驗證,企業名稱 註冊號 組織機構 tesr blur function if myreg.test tesr val regiter code blur function 0 9 u4e00 u9fa5 if regiter code.test regiter code val re...