JAVA正则表达式:为什么使用如何使用?

目录

为什么要使用正则表达式?

如何使用正则表达式

 MATCHER类的方法

start 和 end 方法

appendReplacement 和 appendTail 方法

为什么要使用正则表达式?

正则表达式定义了字符串的模式。

正则表达式可以用来搜索、编辑或处理文本。(例如判断字符串是否符合规范等)

正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。

正则表达式的语法

Java 正则表达式 | 菜鸟教程

如何使用正则表达式

java.util.regex 包主要包括以下三个类:

  • Pattern 类:

    pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。

    Pattern p = Pattern.compile(REGEX);
  • Matcher 类:

    Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。

    Matcher m = p.matcher(INPUT); 
  • PatternSyntaxException:

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

 MATCHER类的方法

Matcher 类的方法
索引方法
public int start()返回以前匹配的初始索引。
public int start(int group) 返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引
public int end()返回最后匹配字符之后的偏移量。
public int end(int group)返回在以前的匹配操作期间,由给定组所捕获子序列的最后字符之后的偏移量。
查找方法
public boolean lookingAt() 尝试将从区域开头开始的输入序列与该模式匹配。
public boolean find()尝试查找与该模式匹配的输入序列的下一个子序列。
public boolean find(int start)重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列。
public boolean matches()尝试将整个区域与模式匹配。
替换方法
public Matcher appendReplacement(StringBuffer sb, String replacement)实现非终端添加和替换步骤。
public StringBuffer appendTail(StringBuffer sb)实现终端添加和替换步骤。
public String replaceAll(String replacement) 替换模式与给定替换字符串相匹配的输入序列的每个子序列。
public String replaceFirst(String replacement) 替换模式与给定替换字符串匹配的输入序列的第一个子序列。
public static String quoteReplacement(String s)返回指定字符串的字面替换字符串。这个方法返回一个字符串,就像传递给Matcher类的appendReplacement 方法一个字面字符串一样工作。

start 和 end 方法

下面是一个对单词 "cat" 出现在输入字符串中出现次数进行计数的例子,很好的说明start和end返回数值的规律:

import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class RegexMatches
{
    private static final String REGEX = "\\bcat\\b";
    private static final String INPUT =
                                    "cat cat cat cattie cat";
 
    public static void main( String[] args ){
       Pattern p = Pattern.compile(REGEX);
       Matcher m = p.matcher(INPUT); // 获取 matcher 对象
       int count = 0;
 
       while(m.find()) {
         count++;
         System.out.println("Match number "+count);
         System.out.println("start(): "+m.start());
         System.out.println("end(): "+m.end());
      }
   }
}
Match number 1
start(): 0
end(): 3
Match number 2
start(): 4
end(): 7
Match number 3
start(): 8
end(): 11
Match number 4
start(): 19
end(): 22(实际该字符串仅有22位)

Start 方法返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引,end 方法最后一个匹配字符的索引加 1。

appendReplacement 和 appendTail 方法

情况1:没有调用appendTail,末尾的字符串不会输出

import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class RegexMatchesReplace
{
   private static String REGEX = "a*b";
   private static String INPUT = "aabfo00000aabfooabfoobk00kk";
   private static String REPLACE = "-";
   public static void main(String[] args) {
      Pattern p = Pattern.compile(REGEX);
      // 获取 matcher 对象
      Matcher m = p.matcher(INPUT);
      StringBuffer sb = new StringBuffer();
      while(m.find()){
         m.appendReplacement(sb,REPLACE);
      }
    //把appendTail注释掉
    //   m.appendTail(sb);
      System.out.println(sb.toString());
   }
}

此时运行结果为-fo00000-foo-foo-。

情况2:  取消注释appendtail,则结果为-fo00000-foo-foo-k00kk,也就是如果仅使用appendREPLACEMENT,则仅有匹配成功完成的所有字符,

简单来说,就是appendReplacement方法,会将匹配到的内容替换成相关字符串,然后追加写入到StringBuffer中,下次再遇到匹配的内容的话,先追加拼接未匹配到的字符串,然后再追加替换的字符串。然后通过appendTail来追加写入末尾的未匹配到的剩余的字符串到StringBuffer对象中。

  • 18
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值