0. 注意
- 正则表达式里的点号(.),可以匹配除换行符之外的所有字符
- Java 语言同其他语言中的正则表达式的不同在于:
- 对 \(反斜线)的不同处理
\\
:其他语言中,表示在正则表达式中插入普通的反斜线(字面上的),不要赋予它任何的意义;- 而在 Java 中,
\\
:我要插入一个正则表达式的反斜线(构成正则式),其后的字符具有特殊的意义;
\\d
:表示一位数字;
\\+
⇒ 加号,\\.
⇒ 点;
- 对 \(反斜线)的不同处理
- 提取单词:
\\W+
(一个或多个字母) - 括号
- 小括号:提取匹配的字符串,
(\s*)
:匹配连续空格
- (0-9) 匹配
0-9
本身, - [0-9]*:匹配数字,可以为空;
- {1-9}:错误写法;
- (0-9) 匹配
- 中括号:定义匹配的范围,[a-zA-Z0-9] 相应位置匹配英文字符和数字,
- [\s*]:表示匹配空格或星号;
- 大括号,表示匹配的长度,\s{3}:匹配三个空格,\s[1, 3]:一到三个空格;
- 小括号:提取匹配的字符串,
1. Java 中支持正则的类
String
str.matches(pattern):布尔判断,返回 true、false;
- ’+911’.matches(‘(-|\+)?\d+’) ⇒ true,
- ‘(-|\+)?\d+’ ⇒ 数字,以加号或者减号开头,或者没有任何符号;
- 密码中必须包含至少一个数字(
\\w*\\d\\w*
):
password.matches("\\w*\\d\\w*")
StringBuffer
- StringTokenizer
2. 定义模式,完成模式(pattern)的匹配(match)
java.lang.String ⇒ java(去掉字符和点)
Pattern p = Pattern.compile("\\w+\\."); p.match(str).replaceAll("");
- \W+:表示非单词(
[^\w]
,\w: [a-zA-Z0-9]
);
- \W+:表示非单词(
创建模式,进行匹配的步骤如下:
- 使用 (static)Pattern.compile() 静态方法编译正则表达式,其会根据 String 类型的正则表达式生成一个 Pattern 对象,(Pattern 类是对 String 类在实现正则匹配等功能上的丰富与拓展)
把你想要检索的字符串传入 Pattern 对象的 matcher() 方法,matcher() 方法会返回一个 Matcher 对象那个,其内有十分丰富的函数实现:
// 我们实现对待检索的字符串 abcabcabcdefabc 的 (abc){2,} 模式的匹配 Pattern p = Pattern.compile("abcabcabcdefabc"); Matcher m = Matcher.match("(abc){2,}"); // 迭代器,遍历和迭代进行 while (m.find()) { System.out.println("Match \"" + m.group() + "\" at position " + m.start() + "-" + (m.end()-1)); }
3. 对日志文件的扫描解析
如下形式的日志文件:
String logData = "" +
"58.27.82.161@02/10/2005\n" +
"204.45.234.40@02/11/2005\n";
逐行扫描,分别将其中的时间和 ip 提取出来。
String pattern = "(\\d+[.]\\d+[.]\\d+[.]\\d+@)" +
"(\\d+{2}/\\d{2}/\\d{4})";
Scanner scanner = new Scanner(logData); // 创建对日志文件扫描的扫描器对象
while (scanner.hasNext(pattern)) {
scanner.next(pattern);
MatchResult m = scanner.match();
String original = m.group(0);
String ip = m.group(1);
String date = m.group(2);
System.out.format("%s: %s from %s\n", original, date, ip);
}