歡迎您光臨本站 註冊首頁

正則表達式實現除去重複的單詞

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0

  起因:還是動態生成圖表時的問題,因為欄位是動態設定的,可以在多個軸、序列中設置欄位,這就很有可能會存在欄位的重複問題.重複的欄位生成Sql並執行是沒有問題的,但執行的結果,生成List(執行Hibernate的sqlquery.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list())時就會有問題了(拋出異常).就要除去查詢sql欄位中的重複欄位.

  想到的是把字元串分隔成數組,再添加到set中,再用Set中的欄位名重新生成不重複的欄位名字元串.

  代碼是這樣的:

  [java]

  String s = "D_NAME,COMPANYID,COMPANY_NAME,PARENT_ID,ID,COMPANYID,COMPANY_NAME,DF_UNIFIED_CODE,DF_CLEARANCE_TAG_ID,";

  String[] s1 = s.split(",");

  Set set = new HashSet();

  for(String ss : s1){

  set.add(ss);

  }

  Iterator iter = set.iterator();

  String newStr = "";

  while(iter.hasNext()){

  newStr = iter.next();

  }

  結果顯示,重複的欄位並沒有去掉.

  把set.add(ss);改為

  [java]

  if(!set.contains(ss))

  set.add(ss);

  結果依舊.

  我不知道java是集合是怎麼處理字元串的.請教java老手,說理論上Set中應該是不會重複的,但對出現這樣的結果,也沒有有效的解決辦法.哪位大蝦能告訴我這是怎麼回事呀?

  然後我就想到使用正則表達式來實現除去字元串的重複欄位名.

  第一個表達式:

  (\b[\w|_] \b,?)(.*)\1(.*),代碼為:

  [java]

  String s = "LOWVOLTAGE_LOSS_RATE,YEARMONTH,LOWVOLTAGE_LOSS_RATE,NAME,YEarmONTH,PPQ,PPQ,SPQ,PPQ,PPQ,SPQ,CODE,LOWVOLTAGE_LOSS_RATE";

  Pattern p = Pattern.compile("(\\b[\\w|_] \\b,?)(.*)\\1(.*)");

  Matcher matcher = p.matcher(s);

  while(matcher.find()){

  s = matcher.replaceAll("$1$2$3");

  System.out.println(s);

  matcher = p.matcher(s);

  }

  if(s.endsWith(","))

  s = s.substring(0,s.length()-1);

  String expect = "LOWVOLTAGE_LOSS_RATE,YEarmONTH,NAME,PPQ,SPQ,CODE";

  Assert.assertEquals(expect, s.substring(0,s.length()-1));

  驗證結果為預期結果.

  本來以為到這裡就已經結束了,可系統剛運行了一會,就報出了錯誤,跟蹤發現,當要處理的字元串為:

  "D_NAME,COMPANYID,COMPANY_NAME,PARENT_ID,ID,COMPANYID,COMPANY_NAME,DF_UNIFIED_CODE,DF_CLEARANCE_TAG_ID,"時,執行的結果會把"DF_CLEARANCE_TAG_ID"替換成"DF_CLEARANCE_TAG_",這可不是我要的結果!

  經改進后的正則表達式為:(\b[\w|_] \b,?)(.*)\b\1\b (.*),再次測試,結果完全滿足要求.


[火星人 ] 正則表達式實現除去重複的單詞已經有538次圍觀

http://coctec.com/docs/java/show-post-59813.html