手機號碼規則模式匹配所有匹配串


前言:

今天,項目中對於號碼搜索那一塊,移動那邊要求能相對比較個性化一些,比如增加這麼一個功能:

內網用戶能夠設置規則(AAAA、ABCD、_ABC……),外網用戶可以通過這些規則進行模式匹配。這裏,

我需要解釋一下所謂的規則:ABCD的代表遞增的4個數字、AAAA代表4個同樣的數字、_代表佔位符表示0~9的數字

比如:比如:ABCD返回0123、1234、2345、3456、4567、5678、6789
            AAAA返回0000、1111、2222、3333、4444...9999
            ABC_返回012_、012_... 678_、789_

實現過程:

下面通過java語言進行簡單的實現

	/**
	 * 手機號碼規則模式匹配的所有匹配串<p>
	 * 比如:ABCD返回0123、1234、2345、3456、4567、5678、6789<p>
	 * 		AAAA返回0000、1111、2222、3333、4444...9999<p>
	 * 		ABC_返回012_、012_... 678_、789_<p>
	 * 解釋:ABCD的代表遞增的4個數字、AAAA代表4個同樣的數字、_代表佔位符表示0~9的數字<p>
	 * @param pattern 輸入字母模式:最多8位,字母必須有A,比如ABC、DCBA<p>
	 * @return 返回需要數據庫匹配串,null表示輸入的規則模式有誤(串裏包含A,且小於8位)<p>
	 * @version v1.0
	 */
	public static final  String getPatternString(String pattern) {
		StringBuffer resultStr = new StringBuffer();
		//pattern = pattern.replaceAll("\\_", ""); 
		
		pattern = pattern.toUpperCase();
		char[] picks = pattern.toCharArray();
		
		if(pattern.indexOf("A") == -1
				|| pattern.replaceAll("[_A-H]", "").length() > 0
				|| pattern.length()>8) {//如果不包含A或含非法字符或大於8位,則表示輸入模式有誤
			return null;
		}
		//用來控制內循環次數
		char[] checks =  pattern.replaceAll("\\_", "").toCharArray();
		HashSet charSet = new HashSet();
		for (int i = 0; i < checks.length; i++) {
			 charSet.add(String.valueOf(checks[i]));
		}
		
		for (int i = 0; i <= 10 - charSet.size(); i++) {
			StringBuffer matchStr = new StringBuffer();
			for (int j = 0; j < picks.length; j++) {
				if(picks[j] != '_' && i + (picks[j] - 'A') > 9){//以防某數位超過了9
					continue;
				}
				switch (picks[j]) 
				{
					case 'A': matchStr.append(i);break;
					case 'B': matchStr.append(i + 1);break;
					case 'C': matchStr.append(i + 2);break;
					case 'D': matchStr.append(i + 3);break;
					case 'E': matchStr.append(i + 4);break;
					case 'F': matchStr.append(i + 5);break;
					case 'G': matchStr.append(i + 6);break;
					case 'H': matchStr.append(i + 7);break;
					case '_': matchStr.append("_");break;
				}
			}
			if(matchStr.toString().length() == pattern.length()){
				resultStr.append(matchStr.toString());
				resultStr.append("|");
			}
		}
		return resultStr.substring(0,resultStr.length() - 1);
	}

使用舉例:System.out.println(getPatternString("GAD_"));

                    輸出:603_|714_|825_|936_

                   System.out.println(getPatternString("ABC"));

                    輸出:012|123|234|345|456|567|678|789

                   System.out.println(getPatternString("DBCA"));

                    輸出:3210|4321|5432|6543|7654|8765|9876

使用說明:1.通過上面的匹配串,我們就可以在數據中通過 " 字段 like '%匹配串%'" 用 "or" 連接起來進行號碼匹配。

                    2.通過匹配出來後,有時我們可能需要對該號碼的匹配串進行一個高亮顯示,基於這個需求,我通過實際

                       項目開發來說明:

	// 從數據集中取出匹配的號碼
	String card_number = "13525021123";//cardNumrResults.getString("card_number");
	//使用上術的getPatternString方法獲取匹配串並轉化成正則表達式形式
	String mantissa = "ABC";//這裏可以動態獲取
         String sourcePattern = getPatternString(mantissa).replaceAll("\\|", ")|(").replaceAll("_", "[0-9]");
	sourcePattern = "(" + sourcePattern + ")";
	//System.out.println(sourcePattern);得到:(012)|(123)|(234)|(345)|(456)|(567)|(678)|(789)
	//設置需要替換的內容
         String replaceModel = "<span>";
         for (int i = 0; i < sourcePattern.split("\\|").length; i++) {
             replaceModel += "$" + (i + 1);
         }
         replaceModel += "</span>";
	card_number = card_number.replaceAll(sourcePattern, replaceModel);//執行替換	
         //System.out.println(card_number)輸出:13525021<span>123</span>

發佈了24 篇原創文章 · 獲贊 9 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章