java中利用正则表达式总结

前言

在博客toSring方法的测试问题与利用正则表达式的解决方案中提到了正则表达式,此处简单的做一下总结一下。注:此博客仅总结正则表达式,直接按正则表达式的规则书写,如xy的连接中间不写括号。

目录

常用运算符

  • 's',将s视作单个字符(s可能是个字符串)
  • 一元运算符
    • x?,x出现一次或不出现
    • x+,x出现一次或多次
    • x*,x出现零次或多次
    • x{3},x出现3次
    • x{1,3},x出现一次或三次
    • x{,4},x出现至多四次(可以为0次)
    • x{2,},x出现至少两次
    • 代表出现次数的一元运算符后可以跟 { 空 , ? , + } \{空,?,+\} {,?,+},分别代表Greedy(贪婪的),Reluctant(勉强的),Possessive(独占的)三种不同的匹配方式。
  • 二元运算符
    • xy,xy的连接
    • x|y,xy的并
  • 多元符
    • [一个字符集合],代表集合中任意一个字符,如[aeiou]
    • [a-z],可以使用-表示区间
    • [\^a-c],^代表不包含的意思,此处为所有不是abc的字符、
    • [a-d[m-p]],两个集合的并,等价于[a-dm-p]
    • [a-z&&[^bc]],两个集合的交,等价于[ad-z]

一些特殊字符

  • .:代表任意一个字符(有时能匹配换行符,有时不能,视实现正则表达式的库决定)
  • \d:代表任意的数字,与[0-9]等价
  • \D:任意非数字字符,等价于[^0-9]
  • \s:代表任意的空白符,包括空格、tab、换行
  • \S\s的非
  • \w:代表任意可能出现在一个word中的字符,包括下划线,等价于[a-zA-Z_0-9]
  • \W\w的非

java中如何使用正则表达式

String类中有一些方法会用到正则表达式

主要讲解一下会用到的类java.util.regex.Pattern

Pattern对象是对正则表达式编译后得到的结果,主要用于用正则表达式提取出字符串中的一部分,如以下代码:

String s = "2020-03-18";
Pattern regex = Pattern.compile("(?<year>\\d{4})-(?<month>\\d{2})-(?<day>\\d{2})");
Matcher m = regex.matcher(s);
if (m.matches()) {
    String year = m.group("year");
    String month = m.group("month");
    String day = m.group("day");
    // Matcher.group(name) returns the part of s that matched (?<name>...)
}

其中的(?<name>regex)代表一个表达式regex,在匹配的同时会将结果保存在名为name的一个区域,这被称作 named capturing groups

使用Pattern.matcher(s)获得格式串对字符串s的匹配结果,会返回一个Matcher类对象,Matcher对象利用Pattern对象对输入字符串进行解析。

之后可用Matchers.matches()判断是否匹配成功,用Mathcers.group(name)获取与格式串中标记为name的表达式相匹配的字符串,如上方代码会获得结果:

year="2020"
month="03"
day="18"

转义符\\和\的区别

\在正则表达式中和在java的字符串中都代表转义,但是有所不同,正则表达式中转义的作用为不将\后面的字符看作特殊字符,比如.在正则表达式中代表任意单个字符,\.就代表字面意义上的.

而在java中的转义目的是把常规的内容解释为非常规的特殊字符,比如\n解释为字符串换行

java中正则表达式解释的顺序为先用java的语法将以双引号形式初始化的String变为由符号组成的字符串,再将这个字符串按照正则表达式的规则进行解释。

\\.的目的是在java中转义一次,第一个\防止第二个\被解释为特殊字符(比如\n中的\),如果将一个被初始化为"\\."的字符串打印出来,会得到\.,第二个\会被正则表达式解释为转义,即此处代表字符意义上的.而不是一个通配符。

总结一下就是\相当于转义了两次,第一次让java看,第二次让正则表达式看。

参考文献

Reading 17: Regular Expressions & Grammars (mit.edu)

Reading 18: Parsers (mit.edu)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值