Java正则表达式简单入门

正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

简介

正则表达式不是一种数学表达式,它是进行字符串匹配的一种工具,可以用于字符串的查找和替换,它并不限于某一种语言,这也带来了在不同的语言中细微的差别。在Java中定义了java.util.regex包,主要包括Pattern类、Matcher类和PatternSynaxException三个类。其中前两个类主要负责正则表达式的产生、解释和匹配,PattrnSynaxException类表示一个正则表达式中的语法错误。

在日常生活中,我们在使用网页搜索时,可能在搜索引擎的预览页面找到了我们需要的内容,但是进入网页后,我们所需的内容就被其他大量无用信息掩埋了,这时候我们可以一点点寻找,顺便把其他信息当作背景资料,但更便捷的方式是使用"Ctrl + F"进行搜索;又或者在word文档编辑中有一个词语使用了错别字,我们也可以使用word中的查找和替换功能。以上实现的原理都是正则表达式的匹配,但正则表达式的功能又不仅限于此,它不仅可以寻找一个字符串,还支持搜索某一类型的字符串,例如查找句子中的整数、英文字母、以某些字符开头和结束的字符串等。因此学习正则表达式对于高效编程是很有用的。

举个栗子

在正式学习正则表达式之前,我们先举几个栗子,以便于后续更好的理解。

public static void main(String[] args) {
		// TODO Auto-generated method stub
		String regex = "Hello";
		Pattern p = Pattern.compile(regex);//产生一个正则表达式的模式
		Matcher matcher = p.matcher("Hello");//根据模式创建一个Matcher对象,可以根据正则表达式匹配任意字符序列
		System.out.println("find: " + matcher.find());
		System.out.println("lookingAt: " + matcher.lookingAt());
		System.out.println("matches: " + matcher.matches());	
	}
输出如下:
find: true
lookingAt: true
matches: true

这是一个简单的栗子,用模式串"Hello"作为正则表达式去匹配字符串"Hello",在Matcher类中有三种匹配的方法:

  • matches方法:是对于整个字符串的匹配,要求整个字符串都与模式串匹配;
  • lookingAt方法:要求字符串必须在起始处就与模式串匹配;
  • find方法:只是单纯地查找字符串中是否有内容可以和模式串匹配,可以增加一个int类型的参数作为起始的寻找点,默认以0为起始。

由此,如果模式串不变,对原程序进行如下修改:

		Matcher matcher = p.matcher("Hello World");
		System.out.println("find: " + matcher.find());
		System.out.println("find(1): " + matcher.find(1));
		System.out.println("lookingAt: " + matcher.lookingAt());
		System.out.println("matches: " + matcher.matches());
输出如下:
find: true
find(1): false
lookingAt: true
matches: false

当用以上的Matcher类的三种匹配方法匹配后,还可以通过start、end、group等索引方法返回匹配到的字符串的具体位置(起始、终止)和具体内容,这里不做具体介绍。

以上这种单纯的字符串匹配使用KMP算法也可以做到,除此以外,我们使用正则表达式最多的实际上还是某一类型字符串的匹配,例如数字。
举个栗子:

String regex = "[0-9]*";//内容为从0到9的整数,个数可以大于或等于0
		Pattern p = Pattern.compile(regex);
		Matcher matcher = p.matcher("123456");
		System.out.println("匹配数字:" + matcher.matches());
输出如下:
匹配数字:true

这里如果将"[0-9]*“改为”[0-9]+",则匹配的数字个数必须大于0才会返回true,即不能匹配空字符串。

另外一种表达0到9的整数的表达式是\d,但不能单纯的将"[0-9]*" 改为"\d*",因为在Java的正则表达式语法中,\起到转义符的作用,这意味着\后的字符需要具有特殊的意义,d不具有特殊的意义,但\d具有表示0到9的整数的意义,所以应改为" \\d*",这可能与其他语言的正则表达式不同。同理,要表达\时应该用\\。

正则表达式的语法

在栗子中我们只是大致了解了Java中正则表达式是如何使用的,如果要实现正则表达式的物尽其用,还要学会更多的正则表达式语法。

下面是对于Java中几种常用的正则表达式的举例:

  • ^ :^ 有两种意义,一种是匹配要检索的文本的开头,如^123要求文本必须以123为开头;另一种意义是代表取反或否定,即匹配不符合条件的字符,如[^a-z]要求匹配不是小写英文字母的字符。
  • $:$的意义与^的第二种意义正相反,要求匹配要检索的文本的结尾,如56$要求匹配以56为结尾的字符。
  • * 和 +:之前介绍过,它们分别表示零次及以上和一次及以上匹配前面的字符或表达式。如go*可以匹配go、g、goo等,而go+可以匹配go、goo等,但不能匹配g。
  • ?:?一方面可以表示其前面括号内的字符串出现字数可以是0次或一次,如Hello(world)?可以匹配Hello或Helloworld;另一方面可以指定匹配模式是“贪心”还是“非贪心”的,贪心表示匹配尽可能长的字符串,非贪心则相反,如对于字符串"123123456",使用"123+?"只会匹配123,而使用"123+"会匹配123123。
  • {n, m}:n与m都为正整数,表示至少匹配n次,但不会超过m次;若没有m,则只有下界,表示至少匹配n次;若只有n,没有",",表示正好匹配n次。
  • [abc]:表示匹配一个字符集,若出现a或b或c中任意一个都可以被匹配。正如前面所述,[^abc]表示匹配非a、b、c的字符。而形如[0-9]、[a-z]的表示可以匹配一定范围的字符内容。

一些常用的Java正则表达式的语法就是这样,了解这些差不多也算入门了,如果想要了解更多有关Java正则表达式的内容,推荐移步下面的网址继续学习:

Oracle关于Pattern类的官方说明.
Oracle关于Matcher类的官方说明.
菜鸟教程-Java正则表达式.

1秒速成(雾)

要想真正学会学透正则表达式是一项大工程,甚至有人专门为正则表达式写了一本书:精通正则表达式(动物书).豆瓣,事实上大多数情况下,我们只需要学会怎么运用正则表达式处理一些常用情况就可以了,如果deadline迫使你无法学习,建议一秒速成,再回过头来慢慢学习。
1秒速成链接:
java正则表达式大全(常用)
.net正则表达式大全
C#正则表达式大全

你可能感兴趣的:(java,正则表达式)