正则表达式
学习内容
正则表达式语法
限定符
字符类
元字符
贪婪匹配与懒惰匹配
- 贪婪匹配(默认):
- 什么是贪婪匹配:在整个表达式匹配成功的前提下,尽可能多的匹配。
- 懒惰匹配:
- 什么是懒惰匹配:在整个表达式匹配成功的前提下,尽可能少的匹配。
- 使用方式:在限定符后面加“?”
- 注意:非贪婪模式只被部分NFA引擎所支持。
在线测试
在Java中使用正则表达式
Pattern类
Pattern:正则表达式的编译表示形式
- 包路径:java.util.regex.Pattern
- 继承关系:Pattern ----> Object
- 静态方法
静态方法 | 功能 |
---|---|
static boolean matches(Stirng regx, String input) | 判断input是否与regx这个正则表达式全字匹配 |
static Pattern compile(String) | 返回参数字符串表示的正则表达式的编译表示形式(Pattern) |
- 实例方法
实例方法 | 功能 |
---|---|
Match matcher(CharSequence) | 基于该Pattern返回的一个Match(匹配器) |
Stirng pattern() | 返回此Pattern实例表示的正则表达式的字符串表示形式(String) |
String[] split(CharSequence) | 根据Pattern实例拆分CharSequence实例,并返回一个Stirng[] |
疑问:拆分字符串时,可以使用单词边界进行拆分么?
不能,因为单词边界指的是是一个(单词与非单词之间的)位置,而不是指一个字符
Matcher类
Matcher:通过解释 Pattern 对 character sequence 执行匹配操作的引擎
简单来说,Matcher中保存了Pattern(正则表达式编译表示形式)与CharSequence(被匹配的字符串)
- 包路径:java.util.regex.Matcher
- 继承关系:Matcher ----> Object
Pattern与Matcher的使用
@Test
public void testPattern() {
// 全字匹配
// 1. Pattern的静态方法matches()
boolean isNums = Pattern.matches("\\d+","245654456");
System.out.println("是否全是数字:" + isNums); //true
// 2. Matcher的实例方法
boolean isLetters = Pattern.compile("[a-zA-Z]+").matcher("abdidioqwgq").matches();
System.out.println("是否全是字母:" + isLetters); //true
// Matcher匹配器的应用
Matcher matcher = Pattern.compile("\\W").matcher("I我love爱you你");
// 将匹配到的所有的非单词字符替换成空格
System.out.println(matcher.replaceAll(" ")); //I love you
// 使用新的Pattern --> 匹配所有的单词字符
matcher.usePattern(Pattern.compile("\\w"));
// 将匹配到的所有单词删除
System.out.println(matcher.replaceAll("")); //我爱你
// 将匹配到的第一个单词字符删除
System.out.println(matcher.replaceFirst("")); //我love爱you你
// 获取匹配个数
// 重设匹配器
matcher.reset();
int count = 0;
while (matcher.find()) {
count++;
}
System.out.println("正则表达式\"" + matcher.pattern() + "\"对字符串\"I我love爱you你\"的匹配次数:" + count); //正则表达式"\w"对字符串"I我love爱you你"的匹配次数:8
}
String类正则表达式的应用
@Test
public void testString() {
// 1. String[] split(String regex) ---> 通过正则表达式对字符串进行拆分
String[] split = "a1b2c3d4e5".split("\\d");
System.out.println(Arrays.toString(split)); // [a, b, c, d, e]
// 2. String[] split(String regex, int limit) 通过正则表达式对字符串进行拆分,limit指定拆分最大个数
String[] split2 = "a1b2c3d4e5".split("\\d",2);
System.out.println(Arrays.toString(split2)); // [a, b2c3d4e5]
// 3. boolean matches(String regex) ----> 判断当前字符串实例是否与正则全字匹配
System.out.println("abcde".matches("\\w*")); // true
// 4. String replaceAll(String regex, String replacement) ----> 将正则匹配到的内容替换为指定内容
System.out.println("123".replaceAll("\\d", "数字")); // 数字数字数字
// 5. String replaceFirst(String regex, String replacement) ----> 将正则匹配到的第一个内容替换为指定内容
System.out.println("123".replaceFirst("\\d", "数字1")); // 数字123
}