Java正则表达式匹配使用实例

本文通过多个实例详细讲解了正则表达式的使用方法,包括基本模式匹配、字符集匹配、重复限定符、分组与引用等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  实例一:
  正则式是最简单的能准确匹配一个给定String的模式,模式与要匹配的文本是等价的.静态的Pattern.matches方法用于比较一个String是否匹配一个给定模式.例程如下:
  String data="java";
  boolean result=Pattern.matches("java",data);
  实例二:
  String[] dataArr = { "moon", "mon", "moon", "mono" };
  for (String str : dataArr) {
  String patternStr="m(o+)n";
  boolean result = Pattern.matches(patternStr, str);
  if (result) {
  System.out.println("字符串"+str+"匹配模式"+patternStr+"成功");
  }
  else{
  System.out.println("字符串"+str+"匹配模式"+patternStr+"失败");
  }
  }
  模式是"m(o+)n",它表示mn中间的o可以重复一次或多次,因此moon,mon,mooon能匹配成功,而mono在n后多了一个o,和模式匹配不上.
  注:
  +表示一次或多次;?表示0次或一次;*表示0次或多次.
  实例三:
  String[] dataArr = { "ban", "ben", "bin", "bon" ,"bun","byn","baen"};
  for (String str : dataArr) {
  String patternStr="b[aeiou]n";
  boolean result = Pattern.matches(patternStr, str);
  if (result) {
  System.out.println("字符串"+str+"匹配模式"+patternStr+"成功");
  }
  else{
  System.out.println("字符串"+str+"匹配模式"+patternStr+"失败");
  }
  }
  注:方括号中只允许的单个字符,模式"b[aeiou]n"指定,只有以b开头,n结尾,中间是a,e,i,o,u中任意一个的才能匹配上,所以数组的前五个可以匹配,后两个元素无法匹配.
  方括号[]表示只有其中指定的字符才能匹配.
  实例四:
  String[] dataArr = { "been", "bean", "boon", "buin" ,"bynn"};
  for (String str : dataArr) {
  String patternStr="b(ee|ea|oo)n";
  boolean result = Pattern.matches(patternStr, str);
  if (result) {
  System.out.println("字符串"+str+"匹配模式"+patternStr+"成功");
  }
  else{
  System.out.println("字符串"+str+"匹配模式"+patternStr+"失败");
  }
  }
  如果需要匹配多个字符,那么[]就不能用上了,这里我们可以用()加上|来代替,()表示一组,|表示或的关系,模式b(ee|ea|oo)n就能匹配been,bean,boon等.
  因此前三个能匹配上,而后两个不能.
  实例五:
  String[] dataArr = { "1", "10", "101", "1010" ,"100+"};
  for (String str : dataArr) {
  String patternStr="\d+";
  boolean result = Pattern.matches(patternStr, str);
  if (result) {
  System.out.println("字符串"+str+"匹配模式"+patternStr+"成功");
  }
  else{
  System.out.println("字符串"+str+"匹配模式"+patternStr+"失败");
  }
  }
  注:从前面可以知道,\d表示的是数字,而+表示一次或多次,所以模式\d+就表示一位或多位数字.
  因此前四个能匹配上,最后一个因为+号是非数字字符而匹配不上.
  实例六:
  String[] dataArr = { "a100", "b20", "c30", "df10000" ,"gh0t"};
  for (String str : dataArr) {
  String patternStr="\w+\d+";
  boolean result = Pattern.matches(patternStr, str);
  if (result) {
  System.out.println("字符串"+str+"匹配模式"+patternStr+"成功");
  }
  else{
  System.out.println("字符串"+str+"匹配模式"+patternStr+"失败");
  }
  }
  模式\w+\d+表示的是以多个单字字符开头,多个数字结尾的字符串,因此前四个能匹配上,最后一个因为数字后还含有单字字符而不能匹配.
  实例七:
  String str="薪水,职位 姓名;年龄 性别";
  String[] dataArr =str.split("[,\s;]");
  for (String strTmp : dataArr) {
  System.out.println(strTmp);
  }
  String类的split函数支持正则表达式,上例中模式能匹配",",单个空格,";"中的一个,split函数能把它们中任意一个当作分隔符,将一个字符串劈分成字符串数组.
  实例八:
  String str="2007年12月11日";
  Pattern p = Pattern.compile("[年月日]");
  String[] dataArr =p.split(str);
  for (String strTmp : dataArr) {
  System.out.println(strTmp);
  }
  Pattern是一个正则表达式经编译后的表现模式 ,它的split方法能有效劈分字符串.
  注意其和String.split()使用上的不同.
  实例九:
  String str="10元 1000人民币 10000元 100000RMB";
  str=str.replaceAll("(\d+)(元|人民币|RMB)", "¥");
  System.out.println(str);
  上例中,模式"(\d+)(元|人民币|RMB)"按括号分成了两组,第一组\d+匹配单个或多个数字,第二组匹配元,人民币,RMB中的任意一个,替换部分表示第一个组匹配的部分不变,其余组替换成¥.
  替换后的str为¥10 ¥1000 ¥10000 ¥100000
  实例十:
  Pattern p = Pattern.compile("m(o+)n",Pattern.CASE_INSENSITIVE) ;
  // 用Pattern类的matcher()方法生成一个Matcher对象
  Matcher m = p.matcher("moon mooon Mon mooooon Mooon");
  StringBuffer sb = new StringBuffer();
  // 使用find()方法查找第一个匹配的对象
  boolean result = m.find();
  // 使用循环找出模式匹配的内容替换之,再将内容加到sb里
  while (result) {
  m.appendReplacement(sb, "moon");
  result = m.find();
  }
  // 最后调用appendTail()方法将最后一次匹配后的剩余字符串加到sb里;
  m.appendTail(sb);
  System.out.println("替换后内容是" + sb.toString());
  实例十一:
  除了用+表示一次或多次,*表示0次或多次,?表示0次或一次外,还可以用{}来指定精确指定出现的次数,X{2,5}表示X最少出现2次,最多出现5次;X{2,}表示X最少出现2次,多则不限;X{5}表示X只精确的出现5次.
  例程:
  String[] dataArr = { "google", "gooogle", "gooooogle", "goooooogle","ggle"};
  for (String str : dataArr) {
  String patternStr = "g(o{2,5})gle";
  boolean result = Pattern.matches(patternStr, str);
  if (result) {
  System.out.println("字符串" + str + "匹配模式" + patternStr + "成功");
  } else {
  System.out.println("字符串" + str + "匹配模式" + patternStr + "失败");
  }
  }
  实例十二:
  -表示从..到…,如[a-e]等同于[abcde]
  String[] dataArr = { "Tan", "Tbn", "Tcn", "Ton","Twn"};
  for (String str : dataArr) {
  String regex = "T[a-c]n";
  boolean result = Pattern.matches(regex, str);
  if (result) {
  System.out.println("字符串" + str + "匹配模式" + regex + "成功");
  } else {
  System.out.println("字符串" + str + "匹配模式" + regex + "失败");
  }
  }
  实例十三:不区分大小写匹配.
  正则表达式默认都是区分大小写的,使用了Pattern.CASE_INSENSITIVE则不对大小写进行区分.
  String patternStr="ab";
  Pattern pattern=Pattern.compile(patternStr, Pattern.CASE_INSENSITIVE);
  String[] dataArr = { "ab", "Ab", "AB"};
  for (String str : dataArr) {
  Matcher matcher=pattern.matcher(str);
  if(matcher.find()){
  System.out.println("字符串" + str + "匹配模式" + patternStr + "成功");
  }
  }
  实例十四:使用正则表达式劈分字符串.
  注意这里要把复杂的模式写在前面,否则简单模式会先匹配上.
  String input="职务=GM 薪水=50000 , 姓名=职业经理人 ; 性别=男 年龄=45 ";
  String patternStr="(\s*,\s*)|(\s*;\s*)|(\s+)";
  Pattern pattern=Pattern.compile(patternStr);
  String[] dataArr=pattern.split(input);
  for (String str : dataArr) {
  System.out.println(str);
  }
  实例十五:解析正则表达式中的文字,\1对应第一个小括号括起来的group1.
  String regex="(\w+)";
  Pattern pattern=Pattern.compile(regex);
  String input="Bill50000GM";
  Matcher matcher=pattern.matcher(input);
  while(matcher.find()){
  System.out.println(matcher.group(2));
  }
  实例十六:将单词数字混合的字符串的单词部分大写.
  String regex="([a-zA-Z]+[0-9]+)";
  Pattern pattern=Pattern.compile(regex);
  String input="age45 salary500000 50000 title";
  Matcher matcher=pattern.matcher(input);
  StringBuffer sb=new StringBuffer();
  while(matcher.find()){
  String replacement=matcher.group(1).toUpperCase();
  matcher.appendReplacement(sb, replacement);
  }
  matcher.appendTail(sb);
  System.out.println("替换完的字串为"+sb.toString());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值