`
沙漠绿树
  • 浏览: 431215 次
  • 性别: 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就可以了

相关推荐

    linux grep不区分大小写查找字符串方法

    图2 grep不区分大小写 备注: grep使用方法: grep [选项] PATTERN 文件 grep -i “error” #忽略大小写区分 grep -v “grep” #忽略grep命令本身,在文档中过滤掉包含有grep字符的行 grep进程时忽略自身 我们在通过...

    QT中字符串的比较、查找、替换等操作 - 大存的博客1

    在QT框架中,字符串处理是日常开发中必不可少的一部分。这篇博客主要介绍了QT中关于字符串的比较、查找、替换等操作,这些操作对于处理文本信息至关重要。以下是对这些操作的详细说明: 1. **字符串拼接**: 在QT...

    编写一个程序统计文本文件英文字母个数,不区分大小写,屏幕输出每个字母出现的次数。

    编写一个程序统计文本文件英文字母个数,不区分大小写,屏幕输出每个字母出现的次数。 参考:文件操作函数,fopen, fclose, fread, fgetc;使用MSDN查找相关帮助; 要求:代码的编写、变量定义等应以《Coding ...

    PHP stristr() 函数(不区分大小写的字符串查找)

    该函数对大小写不敏感。如需对大小写敏感的搜索,请使用 strstr()。 例子: 例子 1 复制代码 代码如下: &lt;?php echo stristr(“Hello world!”,”WORLD”); ?&gt; 输出: world! 例子 2 复制代码

    用MASM32来DIY一个判断字符串1是否为字符串2的子串的函数演示代码(源码+exe)(应用repe cmpsb指令,区分大小写)

    由于我们要区分大小写,所以在这个过程中不会使用到转换字符大小写的操作。 下面是可能的实现步骤: 1. 定义函数入口和参数,包括两个字符串的地址和它们的长度。 2. 初始化计数器和指针,指向字符串2的起始位置。 ...

    多个文件中查找字符串

    2. 忽略大小写:在某些情况下,可能需要忽略字符串的大小写。 3. 区分文件编码:不同的文件可能采用不同的字符编码(如ASCII、UTF-8、GBK等),确保工具能识别正确的编码以避免乱码问题。 五、效率优化: 1. 并行...

    VBHOOK区分大小写代码

    在VB中,标准的字符串函数如`StrComp`、`InStr`或`Like`默认是不区分大小写的。如果要在比较字符串时考虑大小写,我们需要采用一些特定的方法。以下是一些关键知识点: 1. **StrComp 函数**:这是VB中的字符串比较...

    西南交通大学计算机程序设计基础-实验11-C++.docx

    分两种情况处理:一种是区分大小写的查找,另一种是不区分大小写的查找。 - 区分大小写:遍历字符串,当找到目标字符时记录其位置。例如: ```cpp if (x == s[i]) { j = i; break; } ``` - 不区分大小写:...

    Delphi fast Pos & StringReplace:搜索/替换(ansi)字符串,区分大小写,32 位和 64 位-开源

    - **位置查找**:函数支持在 ANSI 字符串或常规字符串中查找子字符串的位置,同时提供区分大小写和不区分大小写的选项。在 64 位环境下,使用这些优化后的函数进行字符串搜索时,性能提升尤为显著,可以达到原始 `...

    字符串查找替换

    除了基本的查找和替换,高级的字符串处理还包括不区分大小写的查找、全局替换(替换所有匹配项,而非仅第一个)以及使用正则表达式的复杂匹配。正则表达式是一种强大的模式匹配工具,能够处理复杂的查找和替换需求,...

    String 字符串操作、比较、查找字符、替换、反转、分割等

    - `equals()`:比较两个字符串的内容是否相同,不区分大小写。 - `equalsIgnoreCase()`:比较两个字符串的内容是否相同,忽略大小写。 - `compareTo()`:按照字典顺序比较字符串,返回值可以判断两个字符串的相对...

    查找字符、字符串

    在这个例子中,`/S`表示搜索所有子目录,`/I`表示不区分大小写,`"example"`是你要查找的字符串,`*`代表所有文件。 压缩包中的`FindStr_chn`可能是一个中文版的`findstr`使用指南或教程,它可能会详细解释各种选项...

    用MASM32来DIY判断字符串1是否为字符串2的子串的函数演示代码(源码+exe)(应用lstrcmp,区分大小写)

    这个功能是通过调用Windows API中的`lstrcpyn`和`lstrcmp`函数来完成的,同时,我们要特别注意区分大小写。 首先,我们需要了解`lstrcpyn`和`lstrcmp`这两个API函数的作用。`lstrcpyn`函数用于复制字符串,并限制了...

    在文本中查找替换字符串程序

    忽略大小写可以使查找不区分大小写,全词匹配则可以确保只匹配完整的单词而不是子串。正则表达式是一种强大的模式匹配工具,能够处理复杂的查找和替换需求,例如匹配连续数字、邮箱地址等。 在实际使用过程中,用户...

    任意文档内查找字符串

    /i 表示不区分大小写 可以参考help findstr的输出解释来使用此命令。 注意: findstr.exe一般在C:\Windows\System32目录下,要从任意路径调用该命令,需要将C:\Windows\System32添加到path环境变量中

    字符串处理函数列表,字符串处理函数列表

    14. strcasecmp:不区分大小写地比较两个字符串,返回值规则同strcmp。 15. strcat:连接两个字符串,将第二个字符串追加到第一个字符串的末尾。 16. strchr:查找字符串中第一个出现的指定字符,返回指向该字符的...

    字符串查找替换器,不但可替换还可以查找

    这些函数允许我们指定查找的条件,如是否区分大小写,是否全词匹配等。 替换字符串通常涉及到`str.replace()`方法,它会将字符串中的某个子串替换为另一个字符串。在Python中,`str.replace(old, new[, count])`...

    字符串查找替换工具2.2

    2. **区分大小写/不区分大小写**:根据需求,用户可以选择是否区分查找字符串的大小写。 3. **全词匹配**:确保查找的字符串是完整单词,而不是部分匹配。 4. **反向查找**:从文件末尾开始查找,这在某些特定情况下...

Global site tag (gtag.js) - Google Analytics