使用正则表达式
要想在java中使用正则表达式,需要调用java.util.regex包,这个包中主要包含3个类:
Pattern 类:Pattern对象表示一个已编译的正则表达式。Pattern 类没有提供公共构造方法。要构建一个Pattern对象,首先必须调用公共的静态 编译方法,它将返回一个 Pattern 对象。
Matcher 类:Matcher 对象是对输入字符串进行解释和匹配操作的。与Pattern 类一样,Matcher 也没有公共构造方法,需要调用 Pattern 对象的 matcher 方法获得一个 Matcher 对象。
PatternSyntaxException类:异常类,正则表达式中有语法错误时会弹出。
捕获组
捕获组是把多个字符当一个单独单元进行处理的方法,它通过对括号内的字符分组来创建。
捕获组是通过从左至右计算其开括号来编号。例如,在表达式((A)(B(C))),有((A)(B(C)))、(A)、(B(C))、(C)这样的四个组。
matcher 对象的 groupCount 方法返回一个 int 值,这个int值表示matcher对象当前有多个分组。
有一个特殊的组(group(0)),总是代表整个表达式。而且不包含在 groupCount 返回的 int 值里
语法
字符 | 说明 |
---|---|
\ | 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。 |
^ | 匹配输入字符串开始的位置。 |
$ | 匹配输入字符串结尾的位置。 |
* | 零次或多次匹配前面的字符或子表达式。 |
+ | 一次或多次匹配前面的字符或子表达式。 |
? | 零次或一次匹配前面的字符或子表达式。 |
{n} | n 是非负整数。正好匹配 n 次。 |
{n,} | n 是非负整数。至少匹配 n 次。 |
{n,m} | m 和 n 是非负整数,匹配至少 n 次,至多 m 次( n <= m)。 |
任何其他限定符+? | 匹配模式是"非贪心的",匹配搜索到的、尽可能短的字符串 |
. | 匹配除"\r\n"之外的任何单个字符。 |
x|y | 匹配 x 或 y。 |
[xyz] | 匹配包含的任一字符。 |
[^xyz] | 匹配未包含的任何字符。 |
[a-z] | 匹配指定范围内的任何字符。 |
[^a-z] | 匹配不在指定的范围内的任何字符。 |
\b | 匹配一个字边界,即字与空格间的位置。例如,“on\b"匹配"only"中的"on"以及“abandon”中的"on”,但不匹配"money"中的"on"。 |
\B | 非字边界匹配。“on\b"匹配"money"中的"on”,但不匹配"only"中的"on"以及“abandon”中的"on"。 |
\cx | 匹配 x 指示的控制字符, x 必须在 A-Z 或 a-z 间。否则,则假定 c 就是"c"字符本身。 |
\d | 数字字符匹配, 等效于 [0-9]。 |
\D | 非数字字符匹配, 等效于 [^0-9]。 |
\xn | 匹配 n, n 是一个十六进制转义码,必须正好是两位数长。允许在正则表达式中使用 ASCII 代码。 |
\f | 换页符匹配, 等效于 \x0c 和 \cL。 |
\n | 换行符匹配, 等效于 \x0a 和 \cJ。 |
\r | 匹配一个回车符, 等效于 \x0d 和 \cM。 |
\s | 匹配任何空白字符, 与 [ \f\n\r\t\v] 等效。 |
\S | 匹配任何非空白字符, 与 [^ \f\n\r\t\v] 等效。 |
\w | 匹配任何字类字符, 与"[A-Za-z0-9_]"等效。 |
\W | 匹配任何非单词字符, 与"[^A-Za-z0-9_]"等效。 |
一些特殊字符的匹配
特殊字符在正则和字符串中都要通过加 ‘\’ 转义,但是转义的方式不太相同
正则表达式中,\\\\为一个\;而字符串String中,\\表示一个\,
正则表达式中 * . + ? () 等特殊字符需要两个斜杠加特殊字符表示,比如\\*表示一个*,而字符串中直接输入即可,
正则表达式中,\W,\d,D,\w等都需要双斜杠,比如\\w,\\W等。
示例
本示例是对文件输入飞机计划项的匹配
输入示例:
Flight:2020-01-01,CA1001 //航班计划项 1
{
DepartureAirport:Harbin //出发机场
ArrivalAirport:Beijing //抵达机场
DepartureTime:2020-01-01 12:00 //起飞时间
ArrivalTime:2020-01-01 14:00 //降落时间
Plane:B9802 //飞机编号
{
Type:A350 //机型
Seats:300 //座位数
Age:2.5 //机龄
}
}
捕获代码:
Pattern pattern = Pattern.compile(
"Flight:(.*?),(.*?)\n\\{\nDepartureAirport:(.*?)\nArrivalAirport:(.*?)\nDepartureTime:(.*?)\nArrivalTime:(.*?)\nPlane:(.*?)\n\\{\nType:(.*?)\nSeats:(.*?)\nAge:(.*?)\n\\}\n\\}\n");
Matcher matcher = pattern.matcher(stringInfo);
if (!matcher.find()) //匹配失败
return false;
String planningEntryNumber = matcher.group(1) ; //计划项日期
String flightNumber = matcher.group(2); //计划项航班号
String OriginAirport = matcher.group(3); //起飞机场
String TerminalAirport = matcher.group(4); //降落机场
String StartTime = matcher.group(5); //起飞时间
String EndTime = matcher.group(6); //降落时间
String number = matcher.group(7); //飞机编号,
String strType = matcher.group(8); //飞机型号
int seats = Integer.valueOf(matcher.group(9)); //座位数
double year = Double.valueOf(matcher.group(10));//机龄
本文只总结了所了解的部分正则表达式相关知识,希望有所帮助。
如有错误欢迎指正。