Java-正则表达式学习总结

2019-07-31 15:01:11 浏览数 (1)

版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)

1.学习背景

在计算机诞生之初,主要用于相关科研计算,但是随着其逐步地平民化,在编程领域可以看到越来越多的字符串的利用,而正则表达式作为一种语法,其方便之处就在于可以利用简短的规则,将目标字符串操作实现,并且其目前已经被大多数编译器所支持。

2.Java中Pattern类、Matcher类介绍

  • Pattern类与Matcher类一起合作.Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持。
  • java正则表达式通过java.util.regex包下的Pattern类与Matcher类实现。
  • Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建,但可以通过Pattern.complie(String regex)简单工厂方法创建一个正则表达式。
  • 注意事项:查看JDK-API文档,可以看到complie方法调用的Pattern(String p, int f)是被private修饰的。而Pattern类中的pattern()是返回当前正则表达式(字符串),只有前者(大写的Pattern)才是Pattern类的构造器。

3.Java中Pattern类的重要方法介绍(涉及方法的重载)

3.1主要方法简介

方法名

入口参数

返回值

修饰

pattern()

正则表达式的字符串形式

public String

Pattern()

String p, int f

此为Pattern类的构造器

private

compile()

String regex

new Pattern(regex, 0)创建的对象

public static Pattern

compile()

String regex, int flags

new Pattern(regex, flag)创建的对象

public static Pattern

toString()

pattern,即正则表达式的字符串形式,和pattern()方法相同

public String

matcher

CharSequence input

Matcher对象

public Matcher

flags()

flags值

public int

matches()

String regex, CharSequence input

boolean值

public static boolean

split()

CharSequence input, int limit

字符串数组(对象)

public String[]

split()

CharSequence input

字符串数组(对象)即split(input, 0)

public String[]

quote()

String s

字符串

public static String

其中CharSequence input 一般就是需要相关操作的字符串

3.2主要方法的详细

  1. complie(String regex):此方法主要通过静态方法调用,输入一个正则表达式,返回一个Patter对象,我们将此对象称作正则表达式的对象,注意:输入的字符串所含的正则表达式原本一杠在Java语法中都要转化为两杠才合法。
  2. complie(String regex, int flags):此方法与上个方法类似,只不过利用flags来控制正则表达式匹配模式的选择,比如是否匹配大小写。详细见下个模块,Java中的匹配模式控制。
  3. split(CharSequence input),用于分隔字符串,并返回一个String[],举例: Pattern p2 =Pattern.compile("\d "); String[] strings=p2.split("Hello123 World456!"); for(String temp:strings){ System.out.print(temp); } 最终Console上显示:Hello World!
  4. matcher(String regex,CharSequence input)是一个静态方法,用于快速匹配字符串,该方法适合用于只匹配一次,且匹配全部字符串。例子: Pattern.matches("\d ","2223");//返回true
  5. matcher(CharSequence input) 此方法用于创建和返回一个Macher类对象,Matcher类的构造方法是仅包内可用即package-private,也就是默认的类修饰,而一般我们只是在别包中import Matcher类,所以并不能调用其构造方法。Pattern.matcher(CharSequence input)方法得到该类的实例。

3.3Java中正则表达式匹配模式的选择

Java在Pattern类中规定了9个匹配模式控制符: public static final int UNIX_LINES = 0x01; public static final int CASE_INSENSITIVE = 0x02; public static final int COMMENTS = 0x04; public static final int MULTILINE = 0x08; public static final int LITERAL = 0x10; public static final int DOTALL = 0x20; public static final int UNICODE_CASE = 0x40; public static final int CANON_EQ = 0x80; public static final int UNICODE_CHARACTER_CLASS = 0x100; 各个字符所控制的模式选择不妨使用的时候上网搜索,不必死记硬背。

4.Java中Matcher类的方法介绍

4.1 Pattern类和Matcher类的区别和联系

Matcher类只能通过Pattern实例调用matcher(CharSequence input)方法来调用,且Pattern类只有一些简单的匹配操作,要想得到更强和便捷的正则匹配操作,那就需要将Pattern与Matcher一起合作。Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持。 一下两个方法类似: 方法一:

代码语言:javascript复制
Pattern p=Pattern.compile("\w ");
Matcher m =p.matcher("string123123");
System.out.println(m.matches());

方法二:

代码语言:javascript复制
    Pattern p =Pattern.compile("");
    System.out.println(p.matches("\w ","string123123"));

上面两个方法说明Pattern类和Matcher类有相似的”全匹配方法“:matches()方法,而且前者实际上调用了后者的matches()方法。方法一中程序更加明确可用,这是其优点。

4.2Matcher类中方法介绍

1.public boolean lookingAt():主要进行匹配字符串开头,案例如下:

代码语言:javascript复制
    Pattern p = Pattern.compile("\d ");
    Matcher m = p.matcher("string123123");
    System.out.println(m.lookingAt());

    Pattern p2 = Pattern.compile("\w ");
    Matcher m2 = p2.matcher("string123123");
    System.out.println(m2.lookingAt());
    
    结果为:false,true;

2.public boolean find():对字符串进行匹配,匹配到的字符串可以在任何位置,案例如下:

代码语言:javascript复制
    Pattern p = Pattern.compile("\d ");
    Matcher m = p.matcher("string123123");
    System.out.println(m.find());

    Pattern p2 = Pattern.compile("\w ");
    Matcher m2 = p2.matcher("string123123");
    System.out.println(m2.find());
    
    结果为:true,true

3.Mathcer.start()/ Matcher.end()/ Matcher.group(),当使用matches(),lookingAt(),find()执行匹配操作后,就可以利用以上三个方法得到更详细的信。

  1. start()返回匹配到的子字符串在字符串中的索引位置(字符串最左侧为索引:0值)
  2. end()返回匹配到的子字符串的最后一个字符在字符串中的索引位置(成立的末尾后一个)
  3. group()返回匹配到的子字符串 案例分析: Pattern p = Pattern.compile("[a-z] "); Matcher m = p.matcher("123string123"); System.out.println(m.find()); System.out.println(m.start()); System.out.println(m.end()); System.out.println(m.group()); 控制台输出: true 3 9 string

4.start(int i),end(int i),group(int i),此三个方法为上诉三个方法的重载,主要用于分组的相关参数显示(小括号()为一个分组),不输入则默认第一组,举例:

代码语言:javascript复制
    Pattern p = Pattern.compile("([a-z] ) (\d )");
    Matcher m = p.matcher("123string123");
    System.out.println(m.find());
    System.out.println(m.start());
    System.out.println(m.start(1));
    System.out.println(m.start(2));
    System.out.println(m.end());
    System.out.println(m.end(1));
    System.out.println(m.end(2));
    System.out.println(m.group());
    System.out.println(m.group(1));
    System.out.println(m.group(2));

	控制台输出:
	true
	3
	3
	9
	12
	9
	12
	string123

5.注意事项

  • 每次执行匹配操作后start(),end(),group()三个方法的值都会改变,改变成匹配到的子字符串的信息,以及它们的重载方法,也会改变成相应的信息.
  • 只有当匹配操作成功,才可以使用start(),end(),group()三个方法,否则会抛出java.lang.IllegalStateException,也就是当matches(),lookingAt(),find()其中任意一个方法返回true时,才可以使用.

0 人点赞