正则表达式笔记(第二弹:JAVA中正则表达式的应用)

在JAVA中使用正则表达式,我们一般需要使用java.util.regex这个JDK自带的API包。
这是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。
我们主要看它的这两个类:Pattern和 Matcher。
一个Pattern对象是一个正则表达式经编译后的表现模式。
一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。

Pattern类

compile(String regex)
这是个静态方法,将给定的正则表达式编译并赋予给 Pattern 类,可以说是一个简单工厂。

Pattern p = Pattern.compile("[/]+");

pattern()
返回该 Pattern 对象所编译的正则表达式。

Pattern p = Pattern.compile("[/]+");
p.pattern();

返回的就是Pattern.complile(String regex)的regex参数,在这个例子中就是 [/]+ 。

matches(String regex, CharSequence input)
编译给定的正则表达式并且对输入的字串以该正则表达式为模开展匹配 , 该方法适合于该正则表达式只会使用一次的情况,也就是只进行一次匹配工作,因为这种情况下并不需要生成一个 Matcher 实例。
但是需要注意的是,这个方法匹配全部字符串才返回true,而不是部分匹配就行。

// 返回false
Pattern.matches("[\\d]+", "123abc");
// 返回true
Pattern.matches("[\\w]+", "123abc");

split(CharSequence input)
将目标字符串按照 Pattern 里所包含的正则表达式为模进行分割。

Pattern p = Pattern.compile("[/]+");
String[] result = p.split( "这是第一段/这是第二段/这是第三段");
for (int i = 0; i < result.length; i++) {
    System.out.println(result[i]);
}

很明显,输出应该是:

这是第一段
这是第二段
这是第三段

split(CharSequence input, int limit)
作用同上,增加参数 limit 目的在于要指定分割的段数,如将 limi 设为 2,那么目标字符串将根据正则表达式分割为两段。

Pattern p = Pattern.compile("[/]+"); 
String[] result = p.split( "这是第一段/这是第二段/这是第三段", 2); 
for (int i = 0; i < result.length; i++) {
    System.out.println(result[i]);
}

输出应该是:

这是第一段
这是第二段/这是第三段

matcher(CharSequence input)
生成一个给定命名的 Matcher 对象。

Pattern p = Pattern.compile("[\\d]+"); 
Matcher m = p.matcher("123abc"); 

Matcher类

一个 Matcher 对象是由一个 Pattern 对象调用其 matcher() 方法而生成的,它可以进行matches()/lookingAt ()/find()三种不同的匹配查找操作。
matches()
尝试对整个目标字符展开匹配检测,也就是只有整个目标字符串完全匹配时才返回真值。

Pattern p = Pattern.compile("[\\d]+"); 
Matcher m1 = p.matcher("123abc");
// false
System.out.println(m1.matches());
Matcher m2 = p.matcher("123");
// true
System.out.println(m2.matches());

lookingAt()
检测目标字符串是否以匹配的子串起始。

Pattern p = Pattern.compile("[\\d]+"); 
Matcher m1 = p.matcher("123abc");
// true
System.out.println(m1.lookingAt());
Matcher m2 = p.matcher("abc123");
// false
System.out.println(m2.lookingAt());

find()
尝试在目标字符串里查找匹配子串。
find(int start)
重设 Matcher 对象,并且尝试在目标字符串里从指定的位置开始查找匹配的子串。

Pattern p = Pattern.compile("[\\d]+"); 
Matcher m1 = p.matcher("123abc");
// true
System.out.println(m1.find());
Matcher m2 = p.matcher("abc");
// false
System.out.println(m2.find());

当使用matches()/lookingAt ()/find()执行匹配操作并且成功匹配后,就可以利用以下方法得到更详细的信息。
start()
返回当前匹配的子串的开始字符在原目标字符串中的位置。
end()
返回当前匹配的子串的结束字符在原目标字符串中的位置 。
group()
返回当前匹配的与组匹配的所有子串内容

Pattern p = Pattern.compile("[\\d]+"); 
Matcher m = p.matcher("abc123abc");
// true
System.out.println(m.find());
// 3
System.out.println(m.start());
// 6,返回的是123后面的索引号
System.out.println(m.end());
// 123
System.out.println(m.group());

注意,如果没有使用matches()/lookingAt ()/find()执行匹配操作,或使用了匹配操作单没有成功匹配到(即匹配方法返回了false),start()这几个方法会抛出异常:java.lang.IllegalStateException: No match available。

start(int i)/end(int i)/group(int i)/groupCount() ,专用于分组操作
start(int group)
返回与匹配模式里指定的组相匹配的子串开始字符在原目标字符串中的位置
end(int group)
返回与匹配模式里指定的组相匹配的子串结束字符在原目标字符串中的位置。
group(int group)
返回当前匹配的与指定的组匹配的子串内容。
groupCount()
返回当前查找所获得的匹配组的数量。

Pattern p = Pattern.compile("([a-z]+)(\\d+)"); 
Matcher m = p.matcher("abc123abc");
// true
System.out.println(m.find());
// 2
System.out.println(m.groupCount());
// 0
System.out.println(m.start(1));
// 3
System.out.println(m.end(1));
// abc
System.out.println(m.group(1));
// 3
System.out.println(m.start(2));
// 6
System.out.println(m.end(2));
// 123
System.out.println(m.group(2));

有一点必须强调,每次执行匹配操作后,start()/end()/group()三个方法的值都会改变,改变成匹配到的子字符串的信息。
看例子就可以明白。

Pattern p = Pattern.compile("[\\d]+"); 
Matcher m = p.matcher("第一个数字:123,第二个数字:456,第三个数字:789");
int i = 1;
while (m.find()) {
    System.out.println("第" + i + "次匹配:");
    System.out.println(m.start());
    System.out.println(m.end());
    System.out.println(m.group());
    i++;
}

控制台会输出如下信息:

第1次匹配:
6
9
123
第2次匹配:
16
19
456
第3次匹配:
26
29
789

replaceAll(String replacement)
将目标字符串里与既有模式相匹配的子串全部替换为指定的字符串。
replaceFirst(String replacement)
将目标字符串里第一个与既有模式相匹配的子串替换为指定的字符串。
appendReplacement(StringBuffer sb, String replacement)
将当前匹配子串替换为指定字符串,并且将替换后的子串以及其之前到上次匹配子串之后的字符串段添加到一个 StringBuffer 对象里。
appendTail(StringBuffer sb)
将最后一次匹配工作后剩余的字符串添加到一个 StringBuffer 对象里。
前两个方法比较好理解,我们看一下后两个方法的例子。

Pattern p = Pattern.compile("[\\d]+"); 
Matcher m = p.matcher("第一个数字:123,第二个数字:456,第三个数字:789。结束。");
StringBuffer sb = new StringBuffer("");
int i = 1;
while (m.find()) {
    System.out.println("第" + i + "次匹配:");
    m.appendReplacement(sb, "aaa");
    System.out.println(sb);
    i++;
}
m.appendTail(sb);
System.out.println("最终的字符串:");
System.out.println(sb);

控制台会输出:

第1次匹配:
第一个数字:aaa
第2次匹配:
第一个数字:aaa,第二个数字:aaa
第3次匹配:
第一个数字:aaa,第二个数字:aaa,第三个数字:aaa
最终的字符串:
第一个数字:aaa,第二个数字:aaa,第三个数字:aaa。结束。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值