Java在字符串中查找匹配的子字符串

Java在字符串中查找匹配的子字符串Java在字符串中查找匹配的子字符串

大家好,又见面了,我是你们的朋友全栈君。

示例:
       在源字符串“You may be out of my sight, but never out of my mind.”中查找“my”的个数。输出:匹配个数为2

三种方法:
       1.通过String的indexOf方法
       2. 通过正则表达式
       3. 通过String的split方法
其中第一种方法只能用于精确匹配,第二三种则可以模糊匹配(方法3的参数为正则表达式)。例如:若将child改为“.my.”,第一种方法失效。

方法1:通过String的indexOf方法

public int indexOf(int ch, int fromIndex) :返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索。如果不存在则返回 -1。

//方法1、通过String的indexOf(String str, int fromIndex)方法
	private void matchStringByIndexOf( String parent,String child )
	{ 
   
		int count = 0;
		int index = 0;
		while( ( index = parent.indexOf(child, index) ) != -1 )
		{ 
   
			index = index+child.length();
			count++;
		}
		System.out.println( "匹配个数为"+count );							  //结果输出
	}

方法2:通过正则表达式

类 Pattern :正则表达式的编译表示形式。
       指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher 对象,依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。
       因此,典型的调用顺序是
       Pattern p = Pattern.compile(“a*b”);
       Matcher m = p.matcher(“aaaaab”);
       boolean b = m.matches();

  • 类 Matcher:通过调用模式的 matcher 方法从模式创建匹配器。创建匹配器后,可以使用它执行三种不同的匹配操作:
           matches 方法尝试将整个输入序列与该模式匹配。
           lookingAt 尝试将输入序列从头开始与该模式匹配。
           find 方法扫描输入序列以查找与该模式匹配的下一个子序列
//方法2、通过正则表达式
	private void matchStringByRegularExpression( String parent,String child )
	{ 
   
		
		int count = 0;
		Pattern p = Pattern.compile( child );
		Matcher m = p.matcher(parent);
		while( m.find() )
		{ 
   
			count++;
			System.out.println( "匹配项" + count+":" + m.group() ); //group方法返回由以前匹配操作所匹配的输入子序列。
		}
		System.out.println( "匹配个数为"+count );							  //结果输出
	}

方法3:通过String的split方法

public String[] split(String regex):根据给定正则表达式的匹配拆分此字符串。 该方法的作用就像是使用给定的表达式和限制参数 0 来调用两参数 split 方法。因此,所得数组中不包括结尾空字符串。

//方法3、通过split方法
	private void matchStringBySplit( String parent,String child )
	{ 
   
		String[] array = parent.split(child);
		System.out.println( "匹配个数为" + (array.length-1) );
	}

完整代码:

import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/** * 在字符串中查找匹配的子字符串 * author:大能豆 QQ:1023507448 * case : * 源字符串:You may be out of my sight, but never out of my mind. * 要查找的子字符串:my * 输出:匹配个数为2 */
public class MatchString { 
   

    //方法1、通过String的indexOf(String str, int fromIndex)方法
    private void matchStringByIndexOf(String parent, String child) { 
   
        int count = 0;
        int index = 0;
        while ((index = parent.indexOf(child, index)) != -1) { 
   
            index = index + child.length();
            count++;
        }
        System.out.println("匹配个数为" + count);//结果输出
    }

    //方法2、通过正则表达式
    private void matchStringByRegularExpression(String parent, String child) { 
   
        int count = 0;
        Pattern p = Pattern.compile(child);
        Matcher m = p.matcher(parent);
        while (m.find()) { 
   
            count++;
            System.out.println("匹配项" + count + ":" + m.group()); //group方法返回由以前匹配操作所匹配的输入子序列。
        }
        System.out.println("匹配个数为" + count); //结果输出
    }

    //方法3、通过split方法,但此方法需考虑子字符串是否是在末尾,若在末尾则不需要-1
    private void matchStringBySplit(String parent, String child) { 
   
        String[] array = parent.split(child);
        System.out.println("匹配个数为" + (array.length - 1));
    }

    public static void main(String[] args) { 
   
        MatchString ms = new MatchString();
        String parent = "You may be out of my sight, but never out of my mind.";
        String child = "my";

        System.out.println("------通过indexOf-------");
        ms.matchStringByIndexOf(parent, child);  //调用方法1

        System.out.println("------通过正则表达式-------");
        ms.matchStringByRegularExpression(parent, child);  //调用方法2

        System.out.println("------通过split方法-------");
        ms.matchStringBySplit(parent, child);  //调用方法3

        String test = "abcdbdasda";
        String[] as = test.split("a");
        System.out.println(Arrays.toString(as));
    }

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160127.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux下nginx启动_centos7添加静态路由

    linux下nginx启动_centos7添加静态路由啥?都2020年了,在Linux中还不会安装部署nginx啊。花5分钟赶紧来看看吧。步骤超详细,学不会你来揍我。

    2022年10月5日
    3
  • 清空input file中的值

    清空input file中的值清空inputfile中的值对于inputtype为file元素:未选择文件之前,它是这个样子:当选择文件名为index.html的文件后,它变成了这个样子,input元素会显示文件名信息:  有时候在选择上传文件时,需要前端对选择的文件格式进行一个判断,当满足条件时,才在input元素中显示其文件名信息,当不满足时则保持原来样子即显示“未选择任何文件”。由于input…

    2022年7月25日
    35
  • Python 万能代码模版:爬虫代码篇「建议收藏」

    Python 万能代码模版:爬虫代码篇「建议收藏」你好,我是悦创。很多同学一听到Python或编程语言,可能条件反射就会觉得“很难”。但今天的Python课程是个例外,因为今天讲的**Python技能,不需要你懂计算机原理,也不需要你理解复杂的编程模式。**即使是非开发人员,只要替换链接、文件,就可以轻松完成。并且这些几个实用技巧,简直是Python日常帮手的最佳实践。比如:爬取文档,爬表格,爬学习资料;玩转图表,生成数据可视化;批量命名文件,实现自动化办公;批量搞图,加水印、调尺寸。接下来,我们就逐一用Python实

    2022年5月26日
    79
  • bzero memset_memset是什么函数

    bzero memset_memset是什么函数 bzero函数函数原型:voidbzero(void*s,intn);头文件:#include<string.h>功能:将字符串s的前n个字节置为0,一般来说n通常取sizeof(s),将整块空间清零。返回值:无返回值例子:将一个数组清零:charstr[10];bzero(str,…

    2022年10月13日
    2
  • String,StringBuffer与StringBuilder的区别

    String,StringBuffer与StringBuilder的区别一、JavaString类——String字符串常量字符串广泛应用 在Java编程中,在Java中字符串属于对象,Java提供了 String类来创建和操作字符串。需要注意的是,String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,这样不仅效率低下,而且大量浪费有限的内存空间。我们来看一下这张对String操作时内存变化的图:我们可…

    2022年6月28日
    13
  • 怎么添加窗口小工具_vc可视化编程

    怎么添加窗口小工具_vc可视化编程原文地址:http://www.cnblogs.com/carekee/articles/1751805.html(转载者注)推荐在MFC中加入BCG,而不是适用BCG建立工程,因为BCG对中文的支持不是很好,到时候会很麻烦。本文以MDI应用程序为例说明如何在已有的VC++工程中使用BCG界面库,我的开发环境为VS2003(在VC6.0下同样适用)。  1,将BCG/BCGCB

    2022年10月8日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号