使用正則匹配去除重複字段

2021-06-09 12:09:25 字數 1647 閱讀 7090

正規表示式這個語法以簡單高效著稱,但是有一點i就是比較複雜。

近期有個功能需要去除字串中重複的部分,由於使用正常的傳統的那種舒服拆分成陣列在乙個乙個匹配的方式感覺有點效率過低浪費效能,於是便想到了正規表示式來匹配重複的字串,並利用string自導的replaceall方法來將相應的字串給刪除掉。

目標字串:

"10110,10254,10554,11025,10254,11002,11532,10110,";

這是乙個數字陣列,但是這裡面有某些id是重複的,我必須將之去除掉。由於我對正則語法實在不熟悉,都是臨時對著說明文件在使用的階段。沒有比較好的思路,所以去網上查了些思路。

發現乙個類似的解決方案,去除重複的字母具體**如下:

string str = "aaaaaaahdbkjsdnfkjsndjkfsdfsdf";   

str = str.replaceall("(?s)(.)(?=.*\\1)", "");

system.out.println(str);

大致看了下說明意思。

(?s) 開啟單行模式 dotall 讓. 號匹配任意字元 

(.) 任意字元 並捕獲在第一組 

(?=.*\1) 這是斷言, 表示後面內容將是 任意個字元加上第一組所捕獲的內容 

第一條:開啟正則的某些模式,感覺跟我沒多少關係,我這是要去除重複的字串,他這是去字母。

從第二條看過去來看,關鍵應該是分組,大致是思路我有點印象了,還是說匹配某個字串,然後新增了個斷言,第三條就是那個斷言,也就是說將當前字串做乙個分組,放到斷言裡去了之後,匹配重複的部分。然後我對著將我的需求修改了一下。

string reg = "(\\d,)(?=(\\d,)*\\1)";

具體**如下

string str = "abcdeabcdeabcdeaaaaaadddddceeeeabcccccccacadaeec"; 

string str1 = "10110,10254,10554,11025,10254,11002,11532,10110,";

string reg = "(\\d,)(?=(\\d,)*\\1)";

str = str.replaceall("(?s)(.)(?=.*\\1)", "");

str1 = str1.replaceall(reg, "");

// str = str.replaceall(reg, "");

system.out.println(str1);

一開始是斷言裡面沒有加 * 導致匹配失敗,我猜測如果不加的話將會只匹配一組了。

但是後來我發現這個裡面有個限制,就是該字串陣列就會被我限制在5個裡面,如果其中有某一條字串超過了5位數,則會導致匹配失敗,這可能是個不足,因為我現在在講6個作為一組,然後一組一組的匹配的,所以才會有這個問題,如果是其他的話,應該就不會有這個問題了。

ok,暫時算是解決問題了。這個斷言還是有點不好理解,感覺有點預言性質,但是又不是進入實際的匹配物件裡面去,主要是用處大概是對當前是匹配物件做進一步的限制和條件,以增強匹配的正確性。這個可能需要做進一步的測試才能得知。先做到這了,斷言還有很多用途(?<=exp)、(?=exp)、(?!exp)、(?

mysql中去除重複字段 distinct

今天在進行資料處理的時候需要去除重複的資料,使用distinct十分便捷,所以做一下說明。1 注意事項 使用distinct命令時需要放在查詢條件的開頭,否則會報錯。如果需要查詢的專案很多但只針對某乙個字段使用distinct的,則可以利用內容拼接的方式來實現。2 一般用法 以下為使用的基礎資料表 ...

SQL去除某欄位重覆記錄

sql去除某欄位重覆記錄 原理 對需要去重覆記錄的字段按組排序,然後取其中一條記錄。在總查詢語句中使用in語法過濾 去掉重覆記錄 select from company where comid in select max comid from company group by companyname...

SQL去除某欄位重覆記錄

原理 對需要去重覆記錄的字段按組排序,然後取其中一條記錄。在總查詢語句中使用in語法過濾 去掉重覆記錄 select from company where comid in select max comid from company group by companyname 得到重覆記錄數 sele...