您的位置:首页 > 编程语言 > Java开发

Java编程思想第四版第十三章——正则表达式

2016-07-15 20:25 471 查看

1. 基本类型

在Java中,\的意思是“插入一个正则表达式的反斜线,其后的字符有特殊的意义”。如,要表示一个数字,正则表达式是\d。如果要插入一个普通的反斜线,应该是\\。不过换行和制表符之类的东西只需使用单反斜线:\n\t.

字符

类别意义
B指定字符B
\xhh十六进制值为oxhh的字符
\uhhhh十六进制表示为oxhhhh的Unicode字符
\t制表符Tab
\r回车
\f换页
\e转义(Escape)
字符类

类别意义
.任意字符
[abc]包含a,b和c的任何字符(和a|b|c作用相同)
[^abc]除了a,b和c之外的任何字符(否定)
[a-zA-Z]从a到z或从A到Z的任何字符(范围)
[abc[hij]]任意a,b,c,h,i和j字符(与a|b|c|h|i|j作用相同)(合并)
[a-z&&[hij]]任意h,i或j(交)
\s空白符(空格、tab、换行、换页和回车)
\S非空白符([^\s])
\d数字[0-9]
\D非数字[^0-9]
\w词字符[a-zA-Z0-9]
\W非词字符[^\w]
如果还需更详细的表达式,可以查看JDK文档中Java.util.regex.Pattern

逻辑操作符

类别意义
XYY跟在X后面
XY
(X)捕获组(capturing group),可以在表达式中用\i引用第i个捕获组
边界匹配符

类别意义
^一行的起始
$一行的结束
\b词的边界
\B非词的边界
\G前一个匹配的结束

2.量词

贪婪型:量词总是贪婪的,除非有其他的选项被设置。贪婪表达式会为所有可能的模式发现尽可能多的匹配。导致此问题的一个典型理由就是假定我们的模式仅能匹配第一个可能的字符组,如果它是贪婪的,那么它会继续往下匹配。

勉强型:用问号来指定,这个量词匹配满足模式所需的最少字符数。因此也称为懒惰的,最少匹配的,非贪婪的,或不贪婪的。

占有型:目前这类的量词只能在Java语言中才可以用。当正则表达式被应用于字符串时,它会产生相当多的状态,以便在匹配失败的时候可以回溯。而“占有的”量词并不保存这些中间状态,因此它们可以防止回溯。常常用于防止正则表达式失控。



import  java.util.regex.*;
public class TestRegularExpression {

public static void main(String[] args) {
// TODO Auto-generated method stub
String[] args1 = new String[] {"(?i)((^[aeiou])|(\\s+[aeiou]))\\w+?[aeiou]\\b"};
String str = "Java now has regular expressions";
String str2 = "Arline ate eight apples and one orange while Anita hadn't any";
if(args1.length <1){
System.out.println("Usage:\njava TestRegularExpression"
+ "characterSequence regularExpression+");
System.exit(0);
}
System.out.println("Input: \"" + args1[0] + "\"");
for (String arg : args1 ) {
System.out.println("Regular expression: \"" + arg + "\"");
Pattern p = Pattern.compile(arg);
Matcher m = p.matcher(str2);
while(m.find()){
System.out.println("Macth\"" + m.group() + "\" at positions "
+ m.start() + "-" + (m.end() - 1 ));
}
}
}

}/*Output
Input: "(?i)((^[aeiou])|(\s+[aeiou]))\w+?[aeiou]\b"
Regular expression: "(?i)((^[aeiou])|(\s+[aeiou]))\w+?[aeiou]\b"
Macth"Arline" at positions 0-5
Macth" ate" at positions 6-9
Macth" one" at positions 27-30
Macth" orange" at positions 31-37
Macth" Anita" at positions 44-49
*///


3.Pattern标记

Pattern类的compile()方法还有一个版本,它接受一个标记参数,如下:

Pattern Pattern.compile(String regex, int flag)

其中flag来自以下Pattern类中的常量:





(1)split()方法将输入字符串断开成字符串对象数组,断开边界由以下正则表达式确定:

String[] split(CharSequence input)

String[] split(CharSequence input, int limit)

(2)替换操作

a) replaceFirst(String replacement)以参数字符串replacement替换掉第一个匹配成功的部分。

b ) replaceAll(String replacement)以参数字符串replacement替换掉所有匹配成功的部分。

c ) appendReplacement(StringBuffer sbuf, String replacement)执行渐进式的替换,它允许你调用其他方法来生成或处理replacement,使你能够以编程的方式将目标分割成组,从而具备更强大的替换功能。

d ) appendTail(StringBuffer sbuf),在执行了一次或多次appendReplacement()之后,调用此方法可以将输入字符串余下的部分复制到sbuf中。

(3)reset()

通过reset()方法,可以将现有的Matcher对象应用于一个新的字符序列。

Matcher m = Pattern.compile("[frb][aui][gx]").matcher("fix the rug with bags");
………………
m.reset("fix the rig with rags");
………………


正则表达式与I/O及扫描输入内容参见书本,通过例子学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息