前言:
今天,項目中對於號碼搜索那一塊,移動那邊要求能相對比較個性化一些,比如增加這麼一個功能:
內網用戶能夠設置規則(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>