多個分割點分割字串
阿新 • • 發佈:2018-11-01
題目:查詢關鍵字為陣列且與陣列的順序無關(變數):示例陣列 String[] s = { "aba", "bab", "z", "q" };
查詢內容(變數): 示例字元 String str = "sababqczac";
替換後的內容為:s<b>ababq</b>c<b>z</b>ac
注:不止匹配一次
import java.util.Arrays; import java.util.HashSet; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test { /** * 思路:[1,3],[7,7],[5,5],[2,4] 把每個區間的兩個數都儲存在同一個數組裡,然後排序 * 陣列中不連續的位置就是分割點,例子中得到的陣列是【1 2 3 4 5 5 7 7】 * 判斷規則,如0不在陣列,而1在陣列中,所以0和1之間是個分割點,則在str[0]後面加上<b> * 5在陣列中,6不在陣列中,則5和6之間是個分割點,str[5]後面加上</b> * 新增count,奇數偶數統計判斷是<b>還是</b>? * @param args */ public static void main(String[] args) { String result = ""; boolean flag = false; //標誌第一位是否匹配到 String[] s = { "aba", "bab", "z", "q"}; String str = "sababqczazcqjhdzabas"; int[] arr = new int[str.length()*str.length()]; //儲存區間內兩個數值 int n = 0;//result 陣列下標 System.out.println("匹配區間如下:"); for (int i = 0; i < s.length; i++) { if(str.indexOf(s[i]) == 0){ //記錄第一位是否匹配到,因為陣列長度不確定,定義陣列多餘的項為0 flag = true; } int[] arrs = checkNum(s[i],str); //陣列s的每一項匹配多次 for (int j = 0; j < arrs.length; j++) { arr[n++] = arrs[j]; arr[n++] = arrs[j] + s[i].length() - 1; for (int k = arrs[j]; k <= arrs[j] + s[i].length() - 1; k++) { arr[n++] = k; } System.out.print("[" + arrs[j] + "," + (arrs[j] + s[i].length() - 1) + "] "); } } System.out.println(); arr = removeRe(arr,flag);//去重複 Arrays.sort(arr); //排序 System.out.print("區間組成陣列:"); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i]+" "); } System.out.println(); int count = 1; //奇數<b>,偶數</b> for (int i = 0; i < str.length(); i++) { if(check(i,arr) && !check(i+1,arr)){ if(count%2 == 0){ result += str.charAt(i) + "</b>"; }else{ result += str.charAt(i) + "<b>"; } count ++; }else if(check(i,arr) && check(i+1,arr)){ result += str.charAt(i); }else if(!check(i,arr) && check(i+1,arr)){ if(count%2 == 0){ result += str.charAt(i) + "</b>"; }else{ result += str.charAt(i) + "<b>"; } count ++; }else if(!check(i,arr) && !check(i+1,arr)){ result += str.charAt(i); } } System.out.println("結果:" + result); } //去重複 private static int[] removeRe(int[] arr,boolean flag) { Set<Integer> set = new HashSet<Integer>(); for (int i = 0; i < arr.length-1; i++) { if(arr[i] !=0 ){ set.add(arr[i]); } } Object[] obj = set.toArray(); int[] arrs; if(flag){ arrs = new int[set.size()+1]; arrs[0] = 0; for (int i = 0; i < obj.length; i++) { arrs[i+1] = (Integer) obj[i]; } }else{ arrs = new int[set.size()]; for (int i = 0; i < obj.length; i++) { arrs[i] = (Integer) obj[i]; } } return arrs; } public static boolean check(int n, int[] arr){ for (int i = 0; i < arr.length; i++) { if(arr[i] == n){ return true; } } return false; } //正則表示式匹配多次 public static int[] checkNum(String s, String str){ int[] arr = new int[str.length()]; int n = 0; Pattern pt = Pattern.compile(s); Matcher mt = pt.matcher(str); while (mt.find()) { arr[n++] = mt.start(); } return removeRe(arr,false); } }