正则表达式


 

正则表达式用于匹配、校验字符串。
 

正则表达式语法

符号描述
.小数点,可匹配\n之外的任何一个字符,要匹配小数点,用\.
xx是某一具体字符,表示匹配该字符
\d匹配0-9之间的一个数字
\D匹配\d之外的任一个字符
\s匹配任一个空白,包括空格、制表符、回车符、换行符
\S匹配\s之外的任一个字符
\w匹配任一个单词字符,包括数字0-9,英文字母大写26个、小写26个,下划线_
\W匹配\w之外的任一个字符
\t匹配空格、Tab之类的空白符
\n换行符
\r回车符

以上式子均只匹配一个字符

 

符号描述
\转义,匹配正则表达式中的预定义的符号,例:\\匹配一个\, \(匹配一个(, \?匹配一个?
|2项中选择一项,或,例:ab|c表示匹配ab或ac
()作为整体看待

 

中括号

符号描述
[ ]匹配指定范围中的任一个字符,例:[abc]表示匹配a、b、c中的任一个字符。
-连续范围,例:[a-z]表示匹配所有小写字母中的任一个字符,[\u4e00-\u9fa5]表示匹配任意一个中文字符
^非,例:\[\^a-d] 表示匹配a、b、c、d之外的任一个字符。^会把后面的部分作为一个整体,eg. [^a-zA-Z0-9!*@-],会把 a-zA-Z0-9!*@- 作为一个整体
&&交集,例:[a-d&&c-z] 相当于[cd],匹配c、d中的任一个字符

中括号只匹配一个字符

 

位置限定

符号描述
^行的开头,放在该部分前面,例:^H 表示匹配H,H要是一行的开头
$行的结尾,放在该部分的后面,例:o$ 表示匹配o,o要是一行的结尾
\b单词的边界,前边界就放在该部分的前面,后边界就放在该部分的后面。
例:\bH 表示匹配H,H要是单词的开头;H\b表示匹配H,H要是单词的结尾。
\B不是单词的边界。不是前边界就放在该部分的前面,不是后边界就放在该部分的后面。
例:\BH 表示匹配H,H不能是单词的开头;H\B表示匹配H,H不能是单词的结尾。

以上均是对一个字符、子表达式位置的说明。

 

数量限定

符号描述
*>=0,至少0个
+>=1,至少1个
?0个或1个
{m}m个
{m,}至少m个
{m,n}至少m个,至多n个

限定的是前一个字符、子表达式出现的次数

 

数量匹配模式

1、Greedy 贪婪模式
数量限定符默认采用贪婪模式,尽可能多的匹配字符,示例

# 能匹配5个就匹配5个,不行就4个,再不行就3个...
\w{2,5}

# ?表示匹配0个或1个,会优先匹配1个,没有才匹配0个
\w?

# +表示匹配1个及以上,优先匹配最多个
\w+

 

2、Reluctant 勉强模式
尽可能少的匹配字符,也称最小匹配模式,需要在数量限定符后用一个额外的?来表示该数量限定符使用最小匹配模式,示例

# 优先匹配2个
\w{2,5}?

# ?匹配01个,优先匹配0个
\w??

# +匹配1个及以上,优先匹配1个
\w+?

 

3、Possessive 占有模式
在数量限定符后面用一个额外的+来表示该部分使用占有模式,这个不常用。

 

在java中使用正则表达式

两种方式

  • 使用String类的方法
  • 使用Pattern+Matcher两个类
     
使用String类的方法
//整串匹配,整个字符串符合regex才算匹配
boolean matches(String  regex)

 
//替换第一个匹配的串
String replaceFirst(String regex, String replacement)  
//替换所有匹配的串
String replaceAll(String regex, String replacement) 
//替换所有匹配的串,但只能直接指定字符串,不能使用正则表达式
String replace(String target, String replacement) 


//以regex作为切割符,把字符串切割为数组
String[] split(String regex)    
  • 替换操作,原串不变,以新串形式返回
  • 字符串形式的regex,正则表达式不用放在/ /中,直接写即可,但正则表达式预定义的字符要用\转义。
     

示例

//true
"hello".matches("hello")
//false
"hello".matches("he")  


//把所有的hello换为Hello
str = str.replaceAll("hello", "Hello");
//去除中文字符
str = str.replaceAll("[\u4e00-\u9fa5]", "");

//把所有的连词线-换为下划线_
str = str.replaceAll("\\-", "_");
//把所有的\替换为/
str = str.replaceAll("\\\\", "/");

对String、正则表达式,\都是特殊字符、需要转义,\在正则表达式中转义写为\\,\\写成String形式还需要转义,写成\\\\

 

使用Pattern+Matcher两个类
// 获取正则表达式对象
Pattern p=Pattern.compile(String regex);

// 创建Matcher对象,参数指定要匹配的字符串
Matcher m=p.matcher(String str); 


// 用Matcher对象来操作
boolean b=m.matches();  //整串匹配
boolean b=m.find();  //匹配子串

String str=m.replaceFirst(String replacement);  //用指定字符串替换第一个匹配
String str=m.replaceAll(String replacement);  //用指定字符串替换所有匹配

 

注意点

1、本来匹配正则表达式中预定义的符号要转义,比如匹配? 要写成 \? ,

但java把正则表达式作为字符串放在双引号中,需要转义\,比如 \w => “\\w”,

其它预定义的符号,比如?、+、()、[ ]等等,不需要再用\转义。

 

2、一些方法的参数是Sring regex,因为正则表达式中可能有转义的特殊字符,和使用普通字符串有所区别。

示例:String原生的 split(Sring regex) 方法

String separator = "|";
String str = "A" + separator + "B";

// 错误用法,结果:[A, |, B]
String[] split1 = str.split(separator);

// 正确用法:|是正则表达式中的特殊字符,要用\转义,\自身也是特殊字符,再用\转义。结果:[A, B]
String[] split2 = str.split("\\|");

//或者使用lang3提供的 StringUtils.split(String, String),参数都是普通字符串
String[] split3 = StringUtils.split(str, "|");
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值