正则表达式(二)——java中使用正则

一、相关类

位于java.util.regex包下面

  • 类Pattern:

     正则表达式的编译表示形式:

     Pattern p = Pattern. compile(regx) ;  //建立正则表达式,并启用相应模式
  • 类Matcher:
      Matcher 对象是对输入字符串进行解释和匹配操作的引擎

      Matcher m = p.matcher(str);     //匹配str字符串

  • 类PatternSyntaxException
       PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。

二、捕获组

在表达式(A)(B(C)),中有以下三组:
group(1):(A)
group(2):(B(C))
group(3):(C)
注:还有一个特殊的组 group(0),它总是代表 整个表达式。该组不包括在 groupCount 的返回值中。
public class RegexMatches{
    public static void main( String args[] ){
 
      // 按指定模式在字符串查找
      String line = "This is hj sdfsd tt ERT21445! OK?";
      String regex = "(\\D*)(\\d+)(.*)";//(非数字*)(数字+)(除了换行符的任意字符*)
 
      // 创建 Pattern 对象
      Pattern r = Pattern.compile(regex);
 
      // 现在创建 matcher 对象
      Matcher m = r.matcher(line);
      if (m.find( )) {
         System.out.println("group(0): " + m.group(0) );
         System.out.println("group(1): " + m.group(1) );
         System.out.println("group(2): " + m.group(2) );
      } else {
         System.out.println("匹配结束");
      }
   }
}
运行结果:
group(0): This is hj sdfsd tt ERT21445! OK?
group(1): This is hj sdfsd tt ERT
group(2): 21445

三、Matcher 类的方法


索引方法

索引方法提供了有用的索引值,精确表明输入字符串中在哪能找到匹配:

序号 方法及说明
1 public int start() 
返回以前匹配的初始索引。
2 public int start(int group)
 返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引
3 public int end()
返回最后匹配字符之后的偏移量。
4 public int end(int group)
返回在以前的匹配操作期间,由给定组所捕获子序列的最后字符之后的偏移量。
start和end的例子:
public class RegexMatches {
	public static void main(String args[]) {
		String regex = "\\bcat\\b";
		String str = "cat cat cat cattie cat";
		Pattern p = Pattern.compile(regex);
		Matcher m = p.matcher(str); // 获取 matcher 对象
		int count = 0;
		while (m.find()) {
			count++;
			System.out.println("------------");
			System.out.println("Match number " + count);
			System.out.println("start(): " + m.start());
			System.out.println("end(): " + m.end());
			System.out.println("str: " + str.substring(m.start(),m.end()));
		}
	}
}
运行结果:
------------
Match number 1
start(): 0
end(): 3
str: cat
------------
Match number 2
start(): 4
end(): 7
str: cat
------------
Match number 3
start(): 8
end(): 11
str: cat
------------
Match number 4
start(): 19
end(): 22
str: cat


研究方法

研究方法用来检查输入字符串并返回一个布尔值,表示是否找到该模式:

序号 方法及说明
1 public boolean lookingAt() 
 尝试将从区域开头开始的输入序列与该模式匹配。
2 public boolean find() 
尝试查找与该模式匹配的输入序列的下一个子序列。
3 public boolean find(int start)
重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列。
4 public boolean matches() 
要求整个序列都匹配
lookingAt和matches的例子:
public class RegexMatches {
	public static void main(String args[]) {
		String regex = "abb";
		String str = "abbbbbbbbbbbbbbb";
		Pattern p = Pattern.compile(regex);
		Matcher m = p.matcher(str); // 获取 matcher 对象
		System.out.println(m.matches());//要求整个序列都匹配
		System.out.println(m.lookingAt());//不要求整个序列都匹配,从起始位置开始匹配上即可
	}
}
运行结果:
false
true

替换方法

替换方法是替换输入字符串里文本的方法:

序号 方法及说明
1 public Matcher appendReplacement(StringBuffer sb, String replacement)
实现非终端添加和替换步骤。
2 public StringBuffer appendTail(StringBuffer sb)
实现终端添加和替换步骤。
3 public String replaceAll(String replacement) 
 替换模式与给定替换字符串相匹配的输入序列的每个子序列。
4 public String replaceFirst(String replacement)
 替换模式与给定替换字符串匹配的输入序列的第一个子序列。
5 public static String quoteReplacement(String s)
返回指定字符串的字面替换字符串。这个方法返回一个字符串,就像传递给Matcher类的appendReplacement 方法一个字面字符串一样工作。
appendReplacement和appendTail的例子:
public class RegexMatches {
	public static void main(String args[]) {
		String regex = "a*b";
		String str = "wwwaabxxxxaaabyyyaaabzz";
		String replaceStr = "=";
		Pattern p = Pattern.compile(regex);
		Matcher m = p.matcher(str); // 获取 matcher 对象
		StringBuffer sb = new StringBuffer();
		int count = 0;
		while (m.find()) {
			count++;
			//1.将每次匹配的子字符串替换为指定的字符串, 如:aab换成=
			//2.并将上次匹配的字符串之后的字符串和替换后的子串添加的sb里,如:www=
			m.appendReplacement(sb, replaceStr);
			System.out.println("第"+count+"次sb:"+sb.toString());
		}
		//将最后一次匹配之后的字符串添加到sb里
		m.appendTail(sb);
		System.out.println("最后sb:"+sb.toString());
	}
}
运行结果:
第1次sb:www=
第2次sb:www=xxxx=
第3次sb:www=xxxx=yyy=
最后sb:www=xxxx=yyy=zz
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值