Java正则表达式总结

基础

相对其他语言,Java对反斜线\有不同的处理。在其他语言中,\\表示“在正则表达式中插入普通的反斜线,所以不要给他任何特殊意义”,而在Java中,\\表示“插入一个正则表达式的反斜线,所以后面的字符具有特殊意义”。例如,Java中如果表示一个数字,那么正则表达式是\\d,而其他语言则是\d。

String中的正则表达式

String中有3个方法可以使用正则表达式,分别是

//判断字符串是否匹配正则表达式,匹配返回true,不然返回false
boolean matches(String regex)

//用给定的正则表达式切割字符串,注意与正则表达式匹配的部分,在最终结果中都不存在了
String[] split(String regex)
//限定切割次数
String[] split(String regex, int limit)

//替换所有匹配到的字符串
String replaceAll(String regex, String replacement)
//替换掉第一个匹配到的字符串
String replaceFirst(String regex, String replacement)

Pattern和Matcher

导入java.util.regex,然后用static Pattern.compile()方法来编译正则表达式。他会根据String类型的正则表达式生成一个Pattern对象,接下来把想要检索的字符串传入Pattern对象的matcher()方法,matcher()方法会生成一个Matcher对象,之后就可以调用Matcher对象里面的方法匹配。例如:

Pattern p = Pattern.compile("a*b");   //编译正则表达式
Matcher m = p.matcher("aaaaab");   //要检索的字符串
/**
*Attempts to match the entire region against the pattern.
*If the match succeeds then more information can be obtained via the start, end, and group methods.
*/
boolean b = m.matches();

下面的代码跟上面实现了同样功能

boolean b = Pattern.matches("a*b", "aaaaab");

CharSequence

接口CharSequence从CharBuffer、String、StringBuilder、StringBuffer类中抽象出了字符序列的一般化定义:

interface CharSequence {
  charAt(int i);
  length();
  subSequence(int start, int end);
  toString();
}

因此下面Pattern和Matcher的一些方法是以CharSequence对象作为参数。

Pattern

Patten类的定义

public final class Pattern
extends Object
implements Serializable

Pattern对象表示编译后的正则表达式。由于Pattern是final的,所以是不可变的,线程安全的。

一些常用的方法:

编译正则表达式
public static Pattern compile(String regex)
public static Pattern compile(String regex, int flags)

flags表示编译标记,一共有9种,他们都是final static int类型的,分别是

  • Pattern.CANON_EQ
  • Pattern.CASE_INSENSITIVE(?i)
  • Pattern.COMMENTS(?x)
  • Pattern.DOTALL(?s)
  • Pattern.LITERAL
  • Pattern.MULTILINE(?m)
  • Pattern.UNICODE_CASE(?u)
  • Pattern.UNICODE_CHARACTER_CLASS(?U)
  • Pattern.UNIX_LINES(?d)
    后面括号字符表示当插入到字符串里面会被识别到而启动这种模式(注意:可以插入到任何位置)。例如:
    Matcher m = Pattern.compile("(?m)(\\\\S+)\\\\s+((\\\\S+)\\\\s+(\\\\S+))$").matcher("I love Java");
    等于
    Matcher m = Pattern.compile("(\\\\S+)\\\\s+((\\\\S+)\\\\s+(\\\\S+))$", Pattern.MULTILINE).matcher("I love Java");
生成Matcher对象
public Matcher matcher(CharSequence input)
匹配操作
public static boolean matches(String regex, CharSequence input)
public String[] split(CharSequence input, int limit)
public String[] split(CharSequence input)

Matcher

Matcher类的定义

public final class Matcher
extends Object
implements MatchResult

Matcher是通过解释Pattern而在CharSequence上执行匹配操作的一个引擎。通过调用Pattern.matcher()方法可以生产一个Matcher对象。创建之后,Matcher对象就可以执行三种匹配操作:

  • The matches method attempts to match the entire input sequence against the pattern.(只有在整个输入都匹配正则表达式时才会返回true)
  • The lookingAt method attempts to match the input sequence, starting at the beginning, against the pattern.(字符串开始处匹配正则表达式就返回true,否则返回false)
  • The find method scans the input sequence looking for the next subsequence that matches the pattern.

这三个方法都返回boolean标志表明匹配成功或者失败。如果成功了就可以调用其他方法进行各种操作。

一些常用的方法:

匹配操作
/**
*Attempts to match the entire region against the pattern.
*If the match succeeds then more information can be obtained via the start, end, and group methods.
*
*Returns:
*true if, and only if, the entire region sequence matches this matcher's pattern
*/
public boolean matches()
/**
*Attempts to find the next subsequence of the input sequence that matches the pattern.
*This method starts at the beginning of this matcher's region, or, if a previous invocation of the method was successful and the matcher has not since been reset, at the first character not matched by the previous match.
*
*If the match succeeds then more information can be obtained via the start, end, and group methods.
*
*Returns:
*true if, and only if, a subsequence of the input sequence matches this matcher's pattern
*/
public boolean find()
public boolean find(int start)
/**
*Attempts to match the input sequence, starting at the beginning of the region, against the pattern.
*Like the matches method, this method always starts at the beginning of the region; unlike that method, it does not require that the entire region be matched.
*
*If the match succeeds then more information can be obtained via the start, end, and group methods.
*
*Returns:
*true if, and only if, a prefix of the input sequence matches this matcher's pattern
*/
public boolean lookingAt()
组(Groups)

组是用括号划分的正则表达式,可以根据组的编号来引用某个组。组号为0表示整个表达式,组号1表示被第一个括号括起的组,以此类推。例如:
A(B(C))D
中有3个组:组0是ABCD,组1是BC,组2是C。

//返回该匹配器的模式中的分组数目,第0组不包括在内。在group、start和end方法中可以使用小于此数目的数字作为numth参数
public int groupCount()

//返回前一次匹配(例如find())操作的第0组(整个匹配)
public String group()
//返回编号为num的捕获型括号匹配的内容,如果匹配成功,但是指定的组没有匹配输入字符串的任何部分,则将会返回null
public String group(int group)
public String group(String name)

//返回这个匹配起点的绝对偏移值,start()就等于start(0)
public int start()
//返回编号为第group的捕获型括号所匹配文本的起点在目标字符串中的绝对偏移值——即从目标字符串起始位置开始计算的偏移值。如果匹配型括号没有参与匹配,则返回-1
public int start(int group)

public int end()
//放回在前一次匹配操作中寻找到的组的最后一个字符索引加一的值
public int end(int group)
查找与替换
public String replaceAll(String replacement)
public String replaceFirst(String replacement)

public static String quoteReplacement(String s)
设置与修改的方法
  • MatchResult对象
//返回的MatchResult对象封装了当前匹配的信息。
public MatchResult toMatchResult()
  • Pattern对象
//更改为新的Pattern对象
public Matcher usePattern(Pattern newPattern)
//返回目前所用的Pattern对象
public Pattern pattern()
  • 目标字符串(或其他CharSequence对象)
//重置回原来整个字符串
public Matcher reset()
//设置新的字符串
public Matcher reset(CharSequence input)
  • 目标字符串的检索范围
//设置新的字符检索范围
public Matcher region(int start, int end)
//返回当前字符检索范围起始
public int regionStart()
//返回当前字符检索范围结束
public int regionEnd()
  • anchoring bounds标志位
public Matcher useAnchoringBounds(boolean b)
public boolean hasAnchoringBounds()
  • transparent bounds标志位
public Matcher useTransparentBounds(boolean b)
public boolean hasTransparentBounds()
只读属性
  • 目标字符串中的match pointer或current pointer,用于支持“寻找下一个匹配”的操作。
  • 目标字符串的append pointer,在查找-替换操作中,复制未匹配的文本部分时使用。

推荐阅读更多精彩内容