正则表达式
正则表达式可以用一些规定的字符来制定规则,并用来校验数据格式的合法性。
限定符
限定符 | 描述 |
? | 表示其前面的一个字符:出现一次或不出现,如 |
* | 表示其前面的一个字符:出现多次或不出现,如 |
+ | 表示其前面的一个字符:出现一次及以上,如 |
{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
,而.
任意字符则为\.
。
贪婪/懒惰匹配
*
和 +
限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个 ?
就可以实现非贪婪或最小匹配。
- 贪婪匹配 :匹配结果尽可能多(
*
、+
、{}
在匹配字符串时,默认会匹配尽可能多的字符) - 懒惰匹配 :匹配结果尽可能少
举例:
<span><b>This is a sample text</b></span>
如果使用<.+>
对上面的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) | 按照正则表达式匹配的内容进行替换 |
public class Test {
public static void main(String[] args) {
String names = "小路fdjkfjsfkadf蓉儿djjsfsjfskfdf过儿";
//1、split(regex)
String[] arrs = names.split("\\w+");
for (int i = 0; i < arrs.length; i++) {
System.out.print(arrs[i]+" ");//小路 蓉儿 过儿
}
//2、replaceAll(regex,replacement)
String names2 = names.replaceAll("\\w+", " ");
System.out.println(names2);//小路 蓉儿 过儿
}
}
Regex支持爬取信息,使用Pattern、Matcher类
标签:regex,字符,abc,匹配,String,正则表达式,&&,Java From: https://blog.51cto.com/u_15936519/6042715