Java中正则表达式的学习

正则表达式简介

正则表达式定义了字符串的模式,可以用来搜索、编辑和处理文本。正则表达式并不仅限于某一种语言。
官网地址:https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

常见的字符匹配
表达式可匹配
\r、\n回车和换行符
\t制表符
\代表“\”本身
\d0-9中的任意一个数字
\w任意一个字母或数字或下划线 即A-Z a-z 0-9、_中任意一个
\s匹配空格、制表符、换页符等空白字符的其中任意一个
.匹配除了换行符(\n)以外的任意一个字符
\S匹配所有非空白字符(\s取反的意思)
\D匹配所有非数字字符(\d取反)
\W匹配所有的数字 字母 下划线以外的字符(\w取反)
\B匹配单词边界,即左右两边都是“\w”范围或者左右两边都不是"\w"范围
包含指定字符的匹配
表达式可匹配
[xy5#]匹配"x"或"y"或"5"或“#”
[^jcd]匹配j,c,d之外的任意一个字符
o-z匹配o-z之间的任意一个字母
^A-G0-5匹配A-F,0-3之外的任意一个字符
\D匹配所有非数字字符(\d取反)
匹配特定位置
表达式作用
^与字符串考开始的地方匹配,不匹配任何字符(注意与[^]区分)
$与字符串结束的地方进行匹配,不匹配任何字符
\b匹配一个单词边界,即单词和空格之间的位置,不匹配任何字符
修饰匹配次数的特殊字符
表达式作用
{n}表达式重复n次。比如f{4}相当于ffff,"\w{2}“相当于”\w\w"
{m,n}表达式至少重复m次,最多重复n次。比如:“hu{2}”可匹配"hu",“huu”,“huuu”
{m,}表达式至少重复m次。例如:“\w\d{2,}“可以匹配”a12","_478",R7236
?匹配表达式0次或1次,相当于{0,1}。比如:”a[cd]?“可匹配”a“,“ac”,“ad”
+表达式至少出现1次,相当于{1,}。比如:”a+b“可匹配"ab",“aab”,“aaab”
*表达式不出现或出现任意次,相当于{0,},比如:”^*b“可匹配”b“,"^^^b"
匹配次数的贪婪与非贪婪

贪婪:尽量匹配多个而不是一个
非贪婪:如果一个表达式能匹配多个或一个的时候,尽量匹配一个而不是多个。
举个栗子:

String line="eeeefffffrrrrrrrrr";
Pattern regex=Pattreern.compile("r{4,}")//贪婪
//Pattern regex=Pattreern.compile("r{4,}?")  //非贪婪
Matcher mat=regex.matches(line);
System.out.println(mat.group());
输出结果为
贪婪:rrrrrrrrr(将所有的r输出)
非贪婪:rrrr
       rrrr
表达式表达结果
{d}(w+)"w+"将匹配第一个"d"之后的所有字符”xxxdxxxd“
(d)(w+)(d)"w+"将匹配第一个d和最后一个d之间的所有字符
匹配特殊字符(只需要加斜杠进行转义)
表达式可匹配
\^匹配^符号本身
\$匹配$符号本身
\.匹配小数点本身
子表达式的关系
表达式作用
∣ \vert 左右两边表达式之间”或“关系,匹配左边或者右边
()1.在被修饰匹配次数的时候,括号中的表达式可作为整体被修饰。
2.取匹配结果的死后,括号中的表达式匹配到的内容可以被单独得到
CJ:反向引用\1,\2…

小括号“()”包含的表达式所匹配的字符串,不仅在匹配结束后可以使用,在匹配过程中也可使用。表达式后面的部分可以引用前面“括号内已经匹配到的字符串”。
引用方法:“\”加上一个数字,“\1”引用第一对括号内匹配的字符串,“\2”引用第而对括号内匹配到的字符串…以此类推。如果一对括号内包含另一对括号,则外层的括号先排序号。

<h1>Hello World!<h1><p>Hi My name is Mike</p><span>Nice to meet you</span>

则正则表达式"<(.+).*(\1)>"中的后面小括号中的\1对应前面括号(.+)的内容。作用:匹配上述html代码中的所有标签h1 p span

正向预搜索&反向预搜索

正向预搜索:匹配的是右侧的一个位置

   String line="hello java best,java test,java good java and python";
        //Pattern pattern=Pattern.compile("java\\s(?=good)");
         Matcher mat=pattern.matcher(line);
        while(mat.find()){
            System.out.println(mat.group());
            System.out.println(line.substring(mat.end()-1));
        }
 输出结果为://匹配的是后面有good的java
 java 
 good java and python

修改上述语句:

Pattern pattern=Pattern.compile("java\\s(?!good)");
输出结果://匹配的是java是后面不是good的java
java 
 best,java test,java good java and python
java 
 test,java good java and python
java 
 and python

反向预搜索(向往串相反的方向搜索)

Pattern pattern=Pattern.compile("(?<=(hello\\s))java");
输出结果://匹配第一个java
java
a best,java test,java good java and python
Pattern pattern=Pattern.compile("(?<!(hello\\s))java");
输出结果://匹配除第一个的所有java
java
a test,java good java and python
java
a good java and python
java
a and python
栗子:

例1:

"^[-_0-9a-zA-Z]*@[0-9a-zA-Z]{2,10}\\.[a-z]{2,5}$"//邮箱校验
// 开始匹配0个或多个数字或字母,@之后是数字字母长度2到10,点之后匹配类似与域名长度在2到5之间。

例2:

"(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[!@#$]).{8,16}"//密码校验
//密码一般包含数字 字母大小写 包含特殊字符。其长度为8-16位

注意事项:
1.正则表达式中的斜杠用\表示,所以java字符串里的"\"在正则中为\\。
2.正则表达式的特殊字符需要转义,如:\\*表示*

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值