Java课程作业-【Java中的正则表达式】
正则表达式
关于正则表达式,许多语言中都有涉及,这边简单罗列一些语法,权当复习。
代码 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束** |
以上是一些简单常用的元字符,下面介绍一些匹配重复方式的常用限定符
代码 | 说明 |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
以及当遇到除了某个类型,其他类型我都需要的情况时需要用到的反义代码
代码 | 说明 |
---|---|
\W | 匹配任意不是字母,数字,下划线,汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 |
还有例如分枝条件、分组等我就不做阐述,可以具体看一下例子
0\d{2}-\d{8}|0\d{3}-\d{7}
这个表达式能匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(如010-12345678),一种是4位区号,7位本地号(0376-2233445)。
(0\d{2})[- ]?\d{8}|0\d{2}[- ]?\d{8}
这个表达式匹配3位区号的电话号码,其中区号可以用小括号括起来,也可以不用,区号与本地号间可以用连字号或空格间隔,也可以没有间隔。你可以试试用分枝条件把这个表达式扩展成也支持4位区号的。
零宽断言、贪婪懒惰等还没有真正学会,具体可以看一下我推荐的一个教程,也可以去搜索网络上关于正则表达式更具体的内容!!初学请多多包涵!
正则表达式30分钟入门教程
作者:deerchao
Java正则表达式
java.util.regex 包主要包括以下三个类:
Pattern 类:
Pattern类是用来干嘛的呢,其实我们可以把他简单理解为就是一个正则表达式(就像File类一样,我们可以简单理解为它就是一个文件)。Pattern类没有公共的构造方法,这意味着我们不能直接new一个Pattern类的对象。在这个类中,提供了一个方法,名字叫compile,我们将正则表达式作为参数,传入这个方法中,就可以得到一个Pattern对象,我们可以将这个对象理解为就是传入的正则表达式。
Pattern类有一个实例方法,叫做matcher,这个方法接收一个参数,就是需要匹配的字符串,方法的返回值就是一个Mather对象。
Matcher 类:
Matcher类又是用来干嘛的呢?Matcher这个单词翻译过来就是匹配器的意思,一个Matcher对象就是一个匹配器,我们通过这个匹配器,就可以操作正则表达式与字符串的匹配过程。操作的是哪个正则表达式和字符串呢?就是我们调用Pettern类的compile方法生成的Pettern对象,以及调用Pettern对象的matcher方法传入的要匹配的字符串。通过这个匹配器对象,我们可以控制字符串的匹配,查看匹配结果,甚至可以替换等便利的操作。
PatternSyntaxException类:
PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class test1 {
public static void main (String[] args) {
// 使用Pattern类的compile方法,传入一个正则表达式,得到一个Pattern对象
Pattern pattern = Pattern.compile("[0-9]+");
// 匹配任意长度,且仅由0-9组成的字符串
// 调用pattern对象的matcher方法,传入需要匹配的字符串, 得到一个匹配器对象
Matcher matcher = pattern.matcher("xx2112Yim0cah342Yim0c21as");
// 从字符串开头,逐一向后匹配,直到无法再匹配为止
while (matcher.find()) {
// 输出上一次匹配的内容
//find方法的作用就是尝试从字符串中找到下一个匹配正则表达式的部分,若匹配成功,就返回true,否则返回false,而已经匹配的部分会被跳过
System.out.print(matcher.group() + ": ");
// 输出上一次匹配的首尾索引
System.out.println(matcher.start() + "->" + (matcher.end() - 1));
//Matcher对象的group()方法返回上一次匹配的部分,而start()方法返回上一次匹配部分的开始索引,end()方法返回上一次匹配部分的结束索引+1的值。
}
}
}
输出结果:
2112: 2->5
0: 9->9
342: 13->15
0: 19->19
21: 21->22
matches 和 lookingAt 方法都用来尝试匹配一个输入序列模式。它们的不同是 matches 要求整个序列都匹配,而lookingAt 不要求。lookingAt 方法虽然不需要整句都匹配,但是需要从第一个字符开始匹配。
replaceFirst 和 replaceAll 方法用来替换匹配正则表达式的文本。不同的是,replaceFirst 替换首次匹配,replaceAll 替换所有匹配