Java中的正则表达式

写在前面:

    你可能不知道正则表达式的含义,但你在实际开发的过程中,一定或多或少的使用过和正则表达式类似的应用场景。举一个例子,我们需要查找出某个文件夹下所有以 .mp3为后缀的文件,我们可能就是使用*.mp3。*是通配符,会匹配任意字符,这样不管前面如何,后缀为.mp3为后缀的文件就被找出来。那么正则表达式又是什么呢?

正则表达式(Regular Expression):

    即对字符串操作的一种逻辑公式,用事先定义好的特殊字符和特殊字符组合来组成一个“规则字符串”。我们利用这个“规则字符串”来表达对字符串的过滤逻辑---来源于百度百科。

    现在,我们再看看最开始说的例子,我们寻找到了.mp3为后缀的文件,那么如果现在要求变高了怎么办?例如:我们需要寻找一些电话号码,以010开头,紧接着是一个-,末尾有任意8个数字。比如,010-12345678这时,其实我们的查找条件就要高于最开始的以MP3为后缀的格式,所以我们要用到正则表达式。以保证,我们可以通过更精确的正则表达式筛选条件来匹配我们的字符串。

正则表达式的组成:

    正则表达式是由普通字符(如a到z)以及特殊字符(成为“元字符”)组成。下面总结了可以用在组成正则表达式的字符。--图片来源于--菜鸟教程(http://www.runoob.com/regexp/regexp-syntax.html)。

  • 普通字符

    普通字符包括没有显式指定为元字符的“可打印字符”和“非打印字符”。包括所有大小写字母,标点符号,以及一些其他符号。

    非打印字符:


  • 特殊字符:

    特殊字符指一些有特殊含义的字符。如*.mp3中的*,就是表达可以代表任意字符。而如果我们想查找字符串中的*,则需要对*转义。即\*

    

  • 限定符:

    限定符用来指定正则表达式中需要出现多少次要求的字符才可以满足匹配条件。一共有6种。


  • 定位符:

    表示可以将正则表达式固定到行首,或行尾。一般用于描述字符串的边界。


Java中怎么使用正则表达式?

    在Java.util.regex包下有两个类,java.util.Pattern和java.util.Matcher。

    Pattern类用于表示正则表达式经过编译之后的形式。我们要通过以下方法,将正则表达式编译成Pattern的一个实例。这样,这个实例才可以被Matcher类进行匹配字符序列。

String regex = "(\\d{4})-((\\d{2})-\\d{2})";
Pattern p = Pattern.compile(regex);

    执行完匹配的所有状态都会驻留在Mathcher中,并且多个Mathcher实例可以共享单个Pattern实例。

    Matcher类是一个状态机器。用于对字符串展开匹配检查。

    其中matcher方法会尝试对输入序列和模式进行匹配。

   public Matcher matcher(CharSequence input) {
        if (!compiled) {
            synchronized(this) {
                if (!compiled)
                    compile();
            }
        }
        Matcher m = new Matcher(this, input);
        return m;
    }

正则表达式Demo1:

    在Demo1中,正则表达式regex将会匹配含义4个数字[0-9],并且以-为结尾的字符串。其中,正则表达式regex的\d,表示数字【0-9】,\\d是对\d进行转义。{4}表示包含有4个前面的\d字符。(\\d{4}-)括号+括号内的内容表示一个捕获组。

package demo1;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Demo2 {
	public static void main(String[] args) {
		String str = "Today is 2018-08-08, and tomorrow is 2020-08-10";
		String regex = "(\\d{4}-)";
		Pattern p = Pattern.compile(regex);
		Matcher m = p.matcher(str);
		while (m.find()) {
			int count = m.groupCount();
			for (int i = 0; i <= count; i++) {
				System.out.println(m.group(i));
			}
		}

	}
}

控制台输出:

2018-
2018-
2020-
2020-

正则表达式Demo2:

    这次的正则表达式和Demo1中的稍有不同,在表达式中增加了一个捕获组。因为捕获组以括号为标准。所以第一个捕获组是

((\\d{4})-\\d{2}),第二个捕获组是(\\d{4})。

package demo1;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Demo3 {
	public static void main(String[] args) {
		String str = "Today is 2018-08-08, and tomorrow is 2020-08-10";
		String regex = "((\\d{4})-\\d{2})";
		Pattern p = Pattern.compile(regex);
		Matcher m = p.matcher(str);
		while (m.find()) {
			int count = m.groupCount();
			for (int i = 0; i <= count; i++) {
				System.out.println(m.group(i));
			}
		}

	}
}

控制台输出:    

2018-08
2018-08
2018
2020-08
2020-08
2020

附录:预定义字符类:

    在使用这样预定义字符之前,要先对这些字符加上\,进行转义。

    

注:在学习的时候,觉得这两篇关于正则表达式的博客写的也非常好,分享给大家。

    http://www.oschina.net/question/12_9507

    http://blog.csdn.net/qq_35580883/article/details/78807242


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值