`
沙漠绿树
  • 浏览: 425726 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

不区分大小写查找字符串(一)

阅读更多
引用
    在做采集时,使用的是自己的API(过几天发布)做数据采集,没有使用他人写API(因为他们使用大部分是采用DOM结构和一些优化功能,在配置上有些不方便)。在字符串查找上,很重要一个是不区分大小写的查找,而java的api中没有直接提供这个方法,所以自己写,分别是模仿indexOf()和lastIndexOf(),大家踊跃指教,代码如下:

public class StringUtil {

	
	public static void main(String[] args) {
	
		String t="aaaaaaaaaa<table></table>aaa<table></table>";
		String s="<TABLE";
		
//		t="";
		
		System.out.println("length="+t.length());
		
		System.out.println(t.indexOf(s,0));
		System.out.println(ignoreCaseIndexOf(t, s,0));
		
		System.out.println(t.lastIndexOf(s));	
		System.out.println(ignoreCaseLastIndexOf(t, s));
	}
/**
	 * 返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始,不区分大小。
	 * 
	 * @param subject 被查找字符串。
	 * @param search 要查找的子字符串。
	 * @return 指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始。
	 */
	public static int ignoreCaseIndexOf(String subject, String search) {
		return ignoreCaseIndexOf(subject, search,-1);
	}
	
	/**
	 * 返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始,不区分大小。
	 * 
	 * @param subject 被查找字符串。
	 * @param search 要查找的子字符串。
	 * @param fromIndex 开始查找的索引位置。其值没有限制,如果它为负,则与它为 0 的效果同样:将查找整个字符串。
	 * 			如果它大于此字符串的长度,则与它等于此字符串长度的效果相同:返回 -1。
	 * @return 指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始。
	 */
	public static int ignoreCaseIndexOf(String subject, String search,
			int fromIndex) {
		
		//当被查找字符串或查找子字符串为空时,抛出空指针异常。
		if (subject == null || search == null) {
			throw new NullPointerException("输入的参数为空");
		}
		
		fromIndex = fromIndex < 0 ? 0 : fromIndex;

		if (search.equals("")) {
			return fromIndex >= subject.length() ? subject.length() : fromIndex;
		}

		int index1 = fromIndex;
		int index2 = 0;

		char c1;
		char c2;

		loop1: while (true) {

			if (index1 < subject.length()) {
				c1 = subject.charAt(index1);
				c2 = search.charAt(index2);
				
			} else {
				break loop1;
			}

			while (true) {
				if (isEqual(c1, c2)) {

					if (index1 < subject.length() - 1
							&& index2 < search.length() - 1) {
						
						c1 = subject.charAt(++index1);
						c2 = search.charAt(++index2);
					} else if (index2 == search.length() - 1) {
					
						return fromIndex;
					} else {
						
						break loop1;
					}
					
				} else {
					
					index2 = 0;
					break;
				}
			}
			//重新查找子字符串的位置
			index1 = ++fromIndex;
		}

		return -1;
	}
	
	/**
	 * 返回指定子字符串在此字符串中最右边出现处的索引。
	 * 
	 * @param subject 被查找字符串。 
	 * @param search 要查找的子字符。
	 * @return 在此对象表示的字符序列中最后一次出现该字符的索引;如果在该点之前未出现该字符,则返回 -1
	 */
	public static int ignoreCaseLastIndexOf(String subject, String search){
		if(subject==null){
			throw new NullPointerException("输入的参数为空");
		}
		else{
			return ignoreCaseLastIndexOf(subject,search,subject.length());
		}
	}
	
	/**
	 * 返回指定字符在此字符串中最后一次出现处的索引,从指定的索引处开始进行反向查找。
	 * @param subject 被查找字符串 。
	 * @param search 要查找的子字符串。
	 * @param fromIndex 开始查找的索引。fromIndex 的值没有限制。如果它大于等于此字符串的长度,则与它小于此字符串长度减 1 的效果相同:将查找整个字符串。
	 * 			如果它为负,则与它为 -1 的效果相同:返回 -1。 
	 * @return 在此对象表示的字符序列(小于等于 fromIndex)中最后一次出现该字符的索引;
	 * 			如果在该点之前未出现该字符,则返回 -1
	 */
	public static int ignoreCaseLastIndexOf(String subject, String search,
			int fromIndex) {
		
		//当被查找字符串或查找子字符串为空时,抛出空指针异常。
		if (subject == null || search == null) {
			throw new NullPointerException("输入的参数为空");
		}

		if (search.equals("")) {
			return fromIndex >= subject.length() ? subject.length() : fromIndex;
		}
		
		fromIndex = fromIndex >= subject.length() ? subject.length() - 1 : fromIndex;

		int index1 = fromIndex;
		int index2 = 0;

		char c1;
		char c2;

		loop1: while (true) {

			if (index1 >= 0) {
				c1 = subject.charAt(index1);
				c2 = search.charAt(index2);
			} else {
				break loop1;
			}

			while (true) {
				//判断两个字符是否相等
				if (isEqual(c1, c2)) {
					if (index1 < subject.length() - 1
							&& index2 < search.length() - 1) {
						
						c1 = subject.charAt(++index1);
						c2 = search.charAt(++index2);
					} else if (index2 == search.length() - 1) {
					
						return fromIndex;
					} else {
						
						break loop1;
					}
				} else {
					//在比较时,发现查找子字符串中某个字符不匹配,则重新开始查找子字符串
					index2 = 0;
					break;
				}
			}
			//重新查找子字符串的位置
			index1 = --fromIndex;
		}

		return -1;
	}
	
	/**
	 * 判断两个字符是否相等。
	 * @param c1 字符1
	 * @param c2 字符2
	 * @return 若是英文字母,不区分大小写,相等true,不等返回false;
	 * 			若不是则区分,相等返回true,不等返回false。
	 */
	private static boolean isEqual(char c1,char c2){
			//  字母小写                   字母大写
		if(((97<=c1 && c1<=122) || (65<=c1 && c1<=90))
				&& ((97<=c2 && c2<=122) || (65<=c2 && c2<=90))
				&& ((c1-c2==32) || (c2-c1==32))){
			
			return true;
		}
		else if(c1==c2){
			return true;
		}
		
		return false;
	}

}



1
0
分享到:
评论
4 楼 沙漠绿树 2011-01-10  
zluyuer 写道
沙漠绿树 写道
zluyuer 写道
2个字符串都toLowerCase然后调用indexOf就可以了
你说的这种方法可以查找到。可能是我这篇文章没有写明是在什么情况使用。在做网页采集时,提取网页里面的信息,是不能把源码大小转换的,不然采集的信息就有错误。网页是怎么写,我们必须保持原样,在这种情况下,我们要做不区分大小写查找,我这种方法是可以实现的。

toLowerCase是生成新的字符串,你找到子串的位置就行了,原来的串不变嘛,原样采集

你的方法是可以。你这样就相当于相同的网页源码在内存中保存了两份,当你做大量采集时,内存资源是很宝贵的。虽然你转换后,字符的比较上要少一种情况,减少了时间,但是在换上也耗费了时间。
3 楼 zluyuer 2011-01-10  
沙漠绿树 写道
zluyuer 写道
2个字符串都toLowerCase然后调用indexOf就可以了
你说的这种方法可以查找到。可能是我这篇文章没有写明是在什么情况使用。在做网页采集时,提取网页里面的信息,是不能把源码大小转换的,不然采集的信息就有错误。网页是怎么写,我们必须保持原样,在这种情况下,我们要做不区分大小写查找,我这种方法是可以实现的。

toLowerCase是生成新的字符串,你找到子串的位置就行了,原来的串不变嘛,原样采集
2 楼 沙漠绿树 2010-10-14  
zluyuer 写道
2个字符串都toLowerCase然后调用indexOf就可以了
你说的这种方法可以查找到。可能是我这篇文章没有写明是在什么情况使用。在做网页采集时,提取网页里面的信息,是不能把源码大小转换的,不然采集的信息就有错误。网页是怎么写,我们必须保持原样,在这种情况下,我们要做不区分大小写查找,我这种方法是可以实现的。
1 楼 zluyuer 2010-07-23  
2个字符串都toLowerCase然后调用indexOf就可以了

相关推荐

Global site tag (gtag.js) - Google Analytics