多个分割点分割字符串

题目:查找关键字为数组且与数组的顺序无关(变量):示例数组 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);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值