java之正则表达式
1.正则表达式
1)什么是正则表达式
正则表达式用来定义一个搜索模式的字符串,可以用于搜索,编辑和操作文本,正则表达式对文本的分析或修改过程为:首先应用文本字符串,它会以定义的模式从左到右匹配文本,并且每个源字符只匹配一次。
2)示例
正则表达式 | 说明 |
this is string text | 精确匹配字符串"this is string text" |
this\s+is\s+string\s+text | 匹配this后跟一个或多个字符串,后跟is,然后is后面跟一个或多个字符串,然后跟string,然后跟一个或多个字符串,然后跟text |
^\d+(\.\d+)? | ^表示匹配字符串的开始,d+匹配一个或多个数字,?表示小括号内的语句是可选的,\.匹配.,小括号表示分组 |
2.正则表达式的编写规则
1.常用的匹配符号
正则表达式 | 说明 |
. | 匹配所有单个字符,除了换行符(linux换行符为\n,windows换行符为\r\n) |
^regex | 匹配以regex开头 |
regex$ | 匹配以regex结尾 |
[abc] | 匹配a或b或c |
[abc][xyz] | 匹配a或b或c,后面跟x或y或z |
[^abc] | 匹配不包含a或b或c |
[a-z0-9] | 范围匹配,匹配a到z和数字0-9之间的一个值 |
AB | 匹配A然后后面跟着B |
A|B | 匹配A或者B |
2.元字符
元字符表示一个预定义的字符。
正则表达式 | 说明 |
\d | 匹配一个数字,是[0-9]的简写 |
\D | 匹配一个非数字,是[^0-9]的简写 |
\s | 匹配一个空格 |
\S | 匹配一个非空格 |
\w | 匹配一个单词字符(字母,数字,下划线) |
\W | 匹配一个非单词字符 |
3.限定符
限定符用来表示一个元素可以出现的频率。
正则表达式 | 说明 | 示例 |
* | 匹配0个或多个 | x*表示匹配0个或多个x,.*代表任意字符串 |
+ | 匹配1个或多个 | x+表示匹配1个或多个x |
? | 匹配1个或者0个 | x?表示匹配0个x或者1个x |
{x} | 只匹配x个字符 | \d{3}表示匹配3个数字 |
{x,y} | 表示匹配大于等于x并且小于等于y | \d{1,4}匹配至少一个至多4个数字 |
*? | 如果?是限定符*或+或?或{}后的第一个字符,表示非贪婪模式,尽可能少的匹配字符 |
4.分组和反向引用
小括号()可以对正则表达式进行分组。创建分组会在正则表达式中创建反向引用,反向引用会保存匹配模式分组的字符串片段,这样我们就可以使用这些字符串片段,我们可以使用$来引用分组的反向引用,$0表示匹配完整模式的字符串,$1表示第一个分组的反向引用,以此类推。
public class Demo02 { public static void main(String[] args) { /*** * 去除o和,n和.之间的空格 * $0:o 和 n . * $1:o和n * $2:空格 * $3:,和. */ String s = "Hello , boxiaoyuan ."; String pattern = "(\\w)(\\s+)([,.])"; System.out.println(s.replaceAll(pattern, "$1$3")); } }
5.易错点
[jpg|png]表示匹配j或p或g或p或n或g中的任意一个字符。
(jpg|png)表示匹配jpg或者png中的一个。
3.字符串使用正则表达式
1.内置的字符串正则处理方法
java中内置四个运行正则表达式的方法,matcher(),split(),replaceFirst(),replaceAll(),relpace方法不支持正则表达式。
方法 | 说明 |
s.matches("regex") | 仅当正则表达式匹配整个字符串时返回true |
s.split("regex") | 按匹配的正则表达式切片字符串 |
s.replaceFirst("regex") | 替换首次匹配的字符串片段 |
s.replaceAll("regex") | 替换所有匹配的字符 |
示例:
public class Demo02 { public static void main(String[] args) { System.out.println("boxiaoyuan".matches("boxiaoyuan")); String[] strs = "bo xiao yuan".split("\\s"); for(String str : strs) { System.out.println(str); } System.out.println("bo xiao yuan".replaceFirst("\\s", "-")); System.out.println("bo xiao yuan".replaceAll("\\s", "-")); } }
4.模式和匹配
java中使用正则表达式需要使用两个类,分别是java.util.regex.Pattern和java.util.regex.Matcher。
使用方法:
第一步:通过正则表达式创建模式对象Pattern。
第二步:通过模式对象Pattern,根据指定字符串创建匹配对象Macher。
第三步:通过匹配对象Matcher,根据正则表达式操作字符串。
示例:
public class Demo02 { public static void main(String[] args) { String s = "hello boxiaoyuan!"; Pattern pattern = Pattern.compile("\\w+", Pattern.CASE_INSENSITIVE); // 通过正则表达式创建模式对象Pattern, 不区分大小写 Matcher matcher = pattern.matcher(s); // 根据指定字符串创建匹配对象 matcher while(matcher.find()) { System.out.println("start index:" + matcher.start()); System.out.println("end index:" + matcher.end()); System.out.println(matcher.group()); } // 创建第二个模式,用于把空格替换为- Pattern replace = Pattern.compile("\\s"); Matcher matcher2 = replace.matcher(s); System.out.println(matcher2.replaceAll("-")); } } ---------输出结果---------- start index:0 end index:5 hello start index:6 end index:16 boxiaoyuan hello-boxiaoyuan!
参考:https://segmentfault.com/a/1190000009162306