正则表达式
正则表达式可以用一些规定的字符来制定规则,并用来校验数据格式的合法性。
限定符
限定符 |
描述 |
? |
表示其前面的一个字符:出现一次或不出现,如 |
* |
表示其前面的一个字符:出现多次或不出现,如 |
+ |
表示其前面的一个字符:出现一次及以上,如 |
{n} |
表示其前面的一个字符:正好出现n次,如 |
{n,} |
表示其前面的一个字符:至少出现n次,如 |
{n,m} |
表示其前面的一个字符:出现的次数范围为[n,m],如 |
当我们需要匹配的字符不止一个时,我们可以使用()
将需要执行匹配的字符括起来
选择
用圆括号 () 将所有选择项括起来,相邻的选择项之间用 | 分隔。
a (cat|dog) 可以匹配 a cat 、 a dog
字符类
当需要匹配由a、b、c组成的单词,可以使用[abc]+
。([]
要求匹配的字符只能取自其里面的内容)
[]
中还可以指定范围,如[a-z]
表所有小写的英文字符
[^abc]
代表除括号内容外的字符
[a-z&&^bc]
a-z 除了b、c
元字符
正则表达式为我们定义好了一些常用的字符类,它们被称为元字符。
其包含数字、空白符、单词开头、结尾等,大多以\
开头。
元字符 |
描述 |
. |
任意字符(不包含换行符) |
\d |
数字 [0-9] |
\D |
非数字 [^0-9] |
\s |
空白字符 (包括Tab和换行符) |
\S |
非空白字符 |
\w |
英文、数字、下划线,等价于 [A-Za-z0-9_] |
\W |
非单词字符 |
\b |
匹配单词的边界,如 |
^ |
匹配行首,比如 |
$ |
匹配行尾,比如 |
Java把带
\
的字符当成转义字符,我们在使用预定义的字符类时(如\d
)需要多加一个\
,即\\d
,而.
任意字符则为\.
。
贪婪/懒惰匹配
*
和 +
限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个 ?
就可以实现非贪婪或最小匹配。
- 贪婪匹配 :匹配结果尽可能多(
*
、+
、{}
在匹配字符串时,默认会匹配尽可能多的字符) - 懒惰匹配 :匹配结果尽可能少
举例:
如果使用<.+>
对上面的HTML标签进行匹配,我们会获取整个句子<span><b>This is a sample text</b></span>
,而不是标签
我们可以使用<.+?>
,将匹配的模式从贪婪匹配切换为懒惰匹配,此时则可以匹配到下面的4个标签 <span>
<b>
</b>
</span>
除上述规则外,正则表达式还有 捕获、断言、递归、平衡组 等内容
Java的Regex类
字符串对象提供了匹配正则表达式的方法
方法 |
描述 |
matches(String regex) |
判断是否匹配正则表达式,匹配返回true,不匹配返回false |
split(String regex) |
按照正则表达式匹配的内容进行分割字符串,返回一个字符串数组 |
replaceAll(String regex,replacement) |
按照正则表达式匹配的内容进行替换 |
Regex支持爬取信息,使用Pattern、Matcher类