写在前面
学过形式语言与自动机的小伙伴对regex应该都不陌生了,我们简单的回顾几个离散中的概念, ( a ) ∗ (a)^{*} (a)∗代表的是克林闭包,代表a可以重复 ( 0 , ∞ ) (0, \infty) (0,∞)次,而 ( a ) + (a)^{+} (a)+代表正闭包,说明a最少出现一次。
Java中regex的应用
- 如果想匹配一段特定的串,直接输入即可
- 数字:\d 或者 [0-9]
- 字母:\w 或者 [a-zA-Z]
- 空白:\s
- 重复0次以上:*
- 重复1次以上:+
- 0次或1次:?
其他都用处不大,可以大概找手册看一遍,知道有那些东西,用的时候再去查就可以。
Attention:在java 正则表达式中\代表反斜杠,所以转义字符前的那个斜杠要输入\才行,也就是说如果我们要去比配数字,我们要使用\\d+,而不是\d+
实际用法
字符串本身就有一个matches方法
我们随意选举一个字符串对象实验,可以发现matches方法返回的是一个Boolean值,如果能够匹配给出的regex就返回true,这就是最简单也是最实用的方法了。
更加复杂的用法
前面的matches方法已经非常使用了,但是有时候我们需要从大型的文本中去匹配一些对象,此时matches方法就不好使了,所以我们需要结合java提供的Pattern和Matcher类来对文本进行读取。
我们首先使用文本读取的方法将字符串读入到一个字符串对象中。
现生成一个Pattern对象,注意,这个对象只能由工厂方法创建即:
Pattern regex = Pattern.compile()
然后再括号内输入你想要的正则表达式即可。
接下来创建一个matcher对象,matcher对象的创建是根据之前我们已经创建的Pattern对象直接创建的:
其参数是我们想要匹配的文本,即我们之前从文本文件中读取的字符串,我们将其输入在括号中即可。
接下来主要有三个方法:
- matches:只有整个字符串都符合regex,才返回true
- lookingAt:从串的最前面开始匹配,有能够匹配的上的,就返回true
- find:只要整个串中有匹配的地方,就返回true
当我们用以上三个方法找到对应的匹配时,用**m.group()**方法就可以得到匹配的字符串啦。这就是regex最简单的应用了。