Java Pattern类详解:正则表达式编译与字符串分割方法使用指南
Java正则操作类Pattern和Matcher

Pattern 在 java.util.regex 包中。它是正则表达式的编译表示形式。此类的实例是不可变的。多个并发线程可以安全地使用它。Pattern 类没有公共构造方法。要创建 Pattern 对象,必须首先调用其公共静态 compile 方法,该方法会返回一个 Pattern 对象。该方法接受一个正则表达式作为它的参数。
split(CharSequence input)方法的作用是分割字符串,它会返回一个 String[]数组。具体如下:
公共静态 void 主函数(字符串数组 args){ }
Pattern 被编译为“\\d+”的模式 p 。
split = p.split("这个车牌是我第100个靓号,我很喜欢。");
for (String s : split) {
将 s 进行输出。
}
}
输出结果:
我的车牌号是京A
这个车牌是我第
个靓号,我很喜欢。
该静态方法的作用是能够快速地进行字符串匹配。它适用于仅需匹配一次并且要匹配全部字符串的情况。此方法和 String 对象的 matches 方法是相同的,具体如下:
System.out.println("12345".matches("\\d+")); // 输出结果为 true ,即 "12345" 匹配正则表达式 "\\d+" , "\\d+" 表示匹配一个或多个数字。
System.out.println("车牌号 12345"进行匹配操作,匹配规则是只包含数字且数量不限,即\\d+,匹配结果为 false);
System.out.println("123d45" 进行匹配操作,匹配的模式是 "\\d+" ,即匹配一个或多个数字,但该字符串中包含了字母 "d" ,所以匹配结果为 false 。)
System.out.println(Pattern.matches("这是一个数字形式的字符串", "123456")); // 表示匹配成功为 true ,即该字符串符合数字形式的要求
System.out.println(Pattern.matches("\\d+", "车牌号123456")); 此语句输出结果为 false ,即判断 "车牌号123456" 是否符合 "\\d+" 的模式,这里 "\\d+" 表示匹配一个或多个数字,而 "车牌号123456" 中包含了非数字字符,所以匹配失败,输出 false 。
// 由于字符串中包含了字母 "abc",所以不满足只由数字组成的条件,返回 false
返回一个 Matcher 对象。Pattern 类仅能进行一些简单的匹配操作,若要获得更强且更便捷的正则匹配操作,就需要将 Pattern 与 Matcher 协同合作。Matcher 对象没有公开的构造器,需通过 Pattern.mathcer 方法来创建实例。Matcher 类既提供了对正则表达式的分组支持,又提供了对正则表达式的多次匹配支持。
Pattern 被编译为 "\\d+" 的模式是 Pattern pattern 。
Matcher 是一个用于模式匹配的对象;它通过 pattern 与特定的字符串进行匹配;这里的字符串是"4348 东 aldkf45 赛发送";通过 matcher 来判断该字符串是否符合特定的模式。
matcher 调用 pattern 方法;此方法会返回 pattern;也就是会返回创建本 Matcher 对象的 Pattern 对象
Matcher 对象能够对输入字符串进行正则解释以及匹配操作,它是一个引擎。和 Pattern 类相同,Matcher 不存在公共构造方法。要获得一个 Matcher 对象,就需要调用 Pattern 对象的 matcher 方法。
Matcher 类提供三种匹配操作方法,这三个方法都返回 boolean 类型。如果匹配成功,就返回 true;如果没有匹配到,就返回 false。需要注意的是,matches()方法是对整个字符串进行匹配的,只有当整个字符串都符合正则规则时,才会返回 true。
lookingAt()用于从字符串的起始位置开始进行匹配,只有当匹配到的字符串位于最前端时才会返回 true。以下是相关代码:
Pattern 被编译为 Pattern p2,其匹配规则为 "\\d+" ; 即匹配一个或多个数字 ; 这是通过 Pattern.compile 方法实现的 ; 它用于在字符串中查找符合特定数字模式的内容 ; 例如查找连续的数字序列等 ; 这种方式在处理数字相关的文本时非常有用 ; 可以方便地对数字进行筛选和提取等操作 。
Matcher 是一个对象,名为 m2,它用于对字符串进行匹配操作。这里的 p2 是一个相关的对象,通过 p2 的 matcher 方法传入字符串"123abc456",从而创建了 m2 这个 Matcher 对象来进行匹配操作。
System.out.println(m2.lookingAt()); 这一语句的结果为 true 。
Matcher 是一个名为 m3 的对象,它用于对字符串 "abc1234" 进行匹配操作,这个匹配操作是由名为 p2 的对象来执行的。
System.out.println(m3.lookingAt()); 这个语句的输出结果为 false 。
find()用于对字符串进行匹配,所匹配到的子字符串可以处于子字符串的任何位置。此方法能够表明是否存在与该模式相匹配的下一个子字符串。简单来讲,就是在字符的某一部分与模式匹配时,就会返回 true,并且会将匹配位置记录到当前位置,再次调用时会从该位置开始匹配下一个位置,所以通常会使用 find 配合循环和 group 方法来获取所有的匹配子串。
Pattern pattern = Pattern.compile("\\d+");
Matcher 是一个对象,它通过 pattern 来进行匹配操作,这里的 pattern 匹配的字符串是 "abc123de456fg" 。
System.out.println 输出的是 matcher 查找的结果,该结果为 true 。
循环获取字串:
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher("abc123de456fg");
System.out 会输出 matcher.find() 的结果,其结果为 true 。
while (matcher.find()){
输出匹配到的内容,即 matcher.group() 的结果。
}
输出:
123
456
使用 matches()、lookingAt()、find()执行匹配操作之后,能够利用这三个方法获取更详细的信息。
start()能给出匹配到的子字符串的首个字符在字符串里的起始索引位置。end()可给出匹配到的子字符串的最后一个字符在字符串中的索引位置。group()会返回匹配到的子字符串。
因此下面这段代码:
String src = "abc123de456fg";
Pattern pattern = Pattern.compile("\\d+");
使用 pattern 对 src 进行匹配,创建了一个 Matcher 对象 matcher 。
while (matcher.find()){
System.out.println 会输出 src 字符串中从 matcher 开始位置到结束位置之间的子字符串。即先获取 matcher 的开始位置和结束位置,然后从 src 字符串中截取这两个位置之间的部分并输出。
}
等价于:
String src = "abc123de456fg";
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher(src);
while (matcher.find()){
System.out.println(matcher.group());
}
start()存在一个对应的重载方法为 start(int i),用于特定操作;end()也有一个对应的重载方法 end(int i),用于特定操作;group()同样有一个对应的重载方法 group(int i),用于特定操作。这些重载方法专用于分组操作。Mathcer 类还有一个 groupCount()方法,该方法用于返回有多少组。
捕获组是一种处理多个字符的方法,将多个字符当作一个独立单元。它通过对括号内的字符进行分组来创建。组号是按照左括号来计数的,并且只认可左括号。
正则表达式(dog)创建了一个分组,这个分组里面包含着“d”,还有“o”,以及“g”。
捕获组是按照从左至右的顺序,通过计算其开括号来进行编号的,也就是数左括号,依次去数左括号的数量。比如,在表达式((A)(B(C)))中,存在四个这样的组:
((A)(B(C)))
(A)
(B(C))
(C)
可以查看表达式有多少个分组,方法是调用 matcher 对象的 groupCount 方法。groupCount 方法会返回一个 int 值,此值表示 matcher 对象当前具有多个捕获组。另外还有一个特殊的组,即 group(0),它始终代表整个表达式,该组不包含在 groupCount 的返回值中。
Pattern p 被创建出来,它是通过 Pattern.compile 方法来实现的,这个方法的参数是 "(\\D+)(\\d+)(\\D+)" 。
Matcher m;m = p.matcher("somewords123 顶发动");
if (m.find()){
System.out 会输出 "分组个数:" 加上 m 的分组数量。
System 输出该组匹配的内容,即输出 m 所匹配到的整个字符串。具体来说,输出的是 m 中与正则表达式匹配的部分,也就是 m.group(0)所代表的内容。
输出 m 中匹配到的第一个分组的内容。
System 输出打印 m 的第二个分组。
System 输出 m 的第三个分组的内容。
}
//输出//
分组个数:3
somewords123顶发动
somewords
123
顶发动