正则表达式
Posted myitnews
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式相关的知识,希望对你有一定的参考价值。
正则表达式是什么?有什么用?
正则表达式(Regular Expression)是一种文本规则,可以用来校验、查找、替换与规则匹配的文本。
正则表达式是一个强大的文本匹配工具,但是它的规则实在很繁琐,而且理解起来也颇为蛋疼,容易让人望而生畏。
学习正则应该从实例去理解规则。
一、正则表达式介绍
JDK中的java.util.regex
包提供了对正则表达式的支持。
java.util.regex
有三个核心类:
- Pattern类:
Pattern
是一个正则表达式的编译表示。 - Matcher类:
Matcher
是对输入字符串进行解释和匹配操作的引擎。 - PatternSyntaxException:
PatternSyntaxException
是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
注:需要格外注意一点,在Java中使用反斜杠""时必须写成 "\\"
。所以本文的代码出现形如String regex = "\\$\\{.*?\\}"
其实就是"${.*?}",不要以为是画风不对哦。
1. Pattern类
Pattern
类没有公共构造方法。要创建一个Pattern
对象,你必须首先调用其静态方法compile
,加载正则规则字符串,然后返回一个Pattern对象。
与Pattern
类一样,Matcher
类也没有公共构造方法。你需要调用Pattern
对象的matcher
方法来获得一个Matcher
对象。
示例
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(content);
2. Matcher类
Matcher
类可以说是java.util.regex
核心类中的必杀技!
Matcher
类有三板斧(三类功能):
- 校验
- 查找
- 替换
校验文本是否与正则规则匹配
为了检查文本是否与正则规则匹配,Matcher提供了以下几个返回值为boolean
的方法。
序号 | 方法及说明 |
---|---|
1 | **public boolean lookingAt() ** 尝试将从区域开头开始的输入序列与该模式匹配。 |
2 | **public boolean find() **尝试查找与该模式匹配的输入序列的下一个子序列。 |
3 | public boolean find(int start)重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列。 |
4 | **public boolean matches() **尝试将整个区域与模式匹配。 |
如果你傻傻分不清上面的查找方法有什么区别,那么下面一个例子就可以让你秒懂。
public static void main(String[] args) { checkLookingAt("hello", "helloworld"); checkLookingAt("world", "helloworld"); checkFind("hello", "helloworld"); checkFind("world", "helloworld"); checkMatches("hello", "helloworld"); checkMatches("world", "helloworld"); checkMatches("helloworld", "helloworld"); } private static void checkLookingAt(String regex, String content) { Pattern p = Pattern.compile(regex); Matcher m = p.matcher(content); if (m.lookingAt()) { System.out.println(content + " lookingAt: " + regex); } else { System.out.println(content + " not lookingAt: " + regex); } } private static void checkFind(String regex, String content) { Pattern p = Pattern.compile(regex); Matcher m = p.matcher(content); if (m.find()) { System.out.println(content + " find: " + regex); } else { System.out.println(content + " not find: " + regex); } } private static void checkMatches(String regex, String content) { Pattern p = Pattern.compile(regex); Matcher m = p.matcher(content); if (m.matches()) { System.out.println(content + " matches: " + regex); } else { System.out.println(content + " not matches: " + regex); } }
输出
helloworld lookingAt: hello
helloworld not lookingAt: world
helloworld find: hello
helloworld find: world
helloworld not matches: hello
helloworld not matches: world
helloworld matches: helloworld
说明
regex = “world” 表示的正则规则是以world开头的字符串,regex = “hello” 和regex = “helloworld” 也是同理。
lookingAt
方法从头部开始,检查content字符串是否有子字符串于正则规则匹配。find
方法检查content字符串是否有子字符串于正则规则匹配,不管字符串所在位置。matches
方法检查content字符串整体是否与正则规则匹配。
查找匹配正则规则的文本位置
为了查找文本匹配正则规则的位置,Matcher
提供了以下方法:
序号 | 方法及说明 |
---|---|
1 | **public int start() **返回以前匹配的初始索引。 |
2 | public int start(int group) 返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引 |
3 | public int end()返回最后匹配字符之后的偏移量。 |
4 | public int end(int group)返回在以前的匹配操作期间,由给定组所捕获子序列的最后字符之后的偏移量。 |
5 | public String group()返回前一个符合匹配条件的子序列。 |
6 | public String group(int group)返回指定的符合匹配条件的子序列。 |
示例:使用start()、end()、group() 查找所有匹配正则条件的子序列
public static void main(String[] args) { final String regex = "world"; final String content = "helloworld helloworld"; Pattern p = Pattern.compile(regex); Matcher m = p.matcher(content); System.out.println("content: " + content); int i = 0; while (m.find()) { i++; System.out.println("[" + i + "th] found"); System.out.print("start: " + m.start() + ", "); System.out.print("end: " + m.end() + ", "); System.out.print("group: " + m.group() + " "); } }
输出
content: helloworld helloworld [1th] found start: 5, end: 10, group: world [2th] found start: 16, end: 21, group: world
二、正则表达式语法规则
三、正则表达式实例
参考
https://www.cnblogs.com/jingmoxukong/p/6026474.html
https://www.cnblogs.com/jingmoxukong/p/6030197.html
https://www.cnblogs.com/jingmoxukong/p/6040572.html
以上是关于正则表达式的主要内容,如果未能解决你的问题,请参考以下文章
正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性