正则表达式&&Java应用

时间:2023-02-07 22:00:12

正则表达式

​10分钟快速掌握正则表达式​

​Regex测试网站​

​正则表达式30分钟入门教程​

正则表达式&&Java应用

正则表达式&&Java应用

正则表达式可以用一些规定的字符来制定规则,并用来校验数据格式的合法性。

限定符

限定符

描述

?

表示其前面的一个字符:出现一次或不出现,如​​used?​​​可以匹配​​use​​​ 或 ​​used​

*

表示其前面的一个字符:出现多次或不出现,如​​ab*c​​​可以匹配​​ac​​​、​​abc​​​、​​abbc​​……

+

表示其前面的一个字符:出现一次及以上,如​​ab+c​​​可以匹配​​abc​​​、​​abbc​​​、​​abbbc​​……

{n}

表示其前面的一个字符:正好出现n次,如​​ab{3}c​​​可以匹配​​abbbc​

{n,}

表示其前面的一个字符:至少出现n次,如​​ab{3,}c​​​可以匹配​​abbbc​​​、​​abbbbc​​……

{n,m}

表示其前面的一个字符:出现的次数范围为[n,m],如​​ab{1,3}​​​可以匹配​​abc​​​、​​abbc​​​、​​abbbc​

当我们需要匹配的字符不止一个时,我们可以使用​​()​​将需要执行匹配的字符括起来

选择

用圆括号 () 将所有选择项括起来,相邻的选择项之间用 | 分隔。

a (cat|dog) 可以匹配 a cata 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

匹配单词的边界,如​​er\b​​​可以匹配​​never​​​但无法匹配​​verb​​​的​​er​​​;​​\bve​​​可以匹配​​verb​​​但无法匹配​​never​​​的​​ve​​。

^

匹配行首,比如​​^a​​​ 只会匹配行首的​​a​

$

匹配行尾,比如​​a$ ​​​ 只会匹配行尾的​​a​

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类