Professional Documents
Culture Documents
盟
第二十五讲
正则表 达式
中关村国际软件人才教育联盟
这些是什 么?
“[0-9A-Za-z]+@([0-9a-zA-
Z]+.){1,2}(com|net|cn|
com.cn)”
“[\u4e00-\u9fa5]”
“http://([\w-]+\.)+[\w-]+(/[\w-
./?%&=]*)?”
“1\\d{2}”
2
中关村国际软件人才教育联盟
目标
正则表达式的概 念
正则表达式的基 本语法
在 Java 中使用正则 表达式
常用正则表达式
3
中关村国际软件人才教育联盟
正则 表达式 的概 念
正则表达式 (regular expression) 是由
普通字符(例如字符 a 到 z )以及特
殊字符(称为元字符)组成的文字模式。
正则表达式作为一个模板,将某个字符模
式与所搜索的字符串进行匹配
4
中关村国际软件人才教育联盟
正则表 达式 的组成 部分
11-1
普通字符
– 由所有那些未显式指定为元字符的打印和非打印字符
组成。这包括所有的大写和小写字母字符、所有数字
、所有标点符号以及一些符号
非打印 字符
– \f 匹配一个换页符
– \n 匹配一个换行符
– \r 匹配一个回车符
– \s 匹配任何空白字符,包括空格、制表符、换页
符等等
– \S 匹配任何非空白字符
– \t 匹配一个制表符
– \v 匹配一个垂直制表符
5
中关村国际软件人才教育联盟
正则表 达式 的组成 部分
11-2
特殊字 符
– 所谓特殊字符,就是一些有特殊含义的字符
– 特殊字符 说明
– $ 匹配输入字符串的结尾位置
– () 标记一个子表达式的开始和结束位置。子表达
式可以获取供以后使用
– * 匹配前面的子表达式 0 次或多次
– + 匹配前面的子表达式 1 次或多次
– . 匹配除换行符 \n 之外的任何单字符
– [ 标记一个中括号表达式的开始
– ? 匹配前面的子表达式 0 次或 1 次
6
中关村国际软件人才教育联盟
正则表 达式 的组成 部分
11-3
– 特殊字符 说明
– \ 将下一个字符标记为或特殊字符、或原义
字符、或向后引用、或八进制转义符。例如, ‘
n’ 匹配字符 ‘ n‘ ,而 '\n' 匹配换行符。序列
'\\' 匹配 "\" ,而 '\(' 则匹配 "("
– ^ 匹配输入字符串的开始位置,除非在方括
号表达式中使用,此时它表示不接受该字符集合
– { 标记限定符表达式的开始
– | 指明两项之间的一个选择
7
中关村国际软件人才教育联盟
正则表 达式 的组成 部分
11-4
限定 符
– 限定符用来指定正则表达式的一个给定组件必须要
出现多少次才能满足匹配。共 6 种:
– 限定符 说明
– * 匹配前面的子表达式 0 次或多次
– + 匹配前面的子表达式 1 次或多次
– ? 匹配前面的子表达式 0 次或 1 次
– {n} n 是一个非负整数。匹配确定的 n 次
– {n,} n 是一个非负整数。至少匹配 n 次
– {n,m} m 和 n 均为非负整数,其中 n <=
m 。最少匹配 n 次且最多匹配 m 次。注意在逗
号和两个数之间不能有空格
8
中关村国际软件人才教育联盟
正则表 达式 的组成 部分
11-5
定位符
– 用来描述字符串或单词的边界, ^ 和 $ 分别指
字符串的开始字符与结束字符
– 不能对定位符使用限定符
选择
– 用圆括号 () 将所有选择项括起来,相邻的选择
项之间用 | 分隔
9
中关村国际软件人才教育联盟
正则表 达式 的组成 部分
11-6
其它
– (pattern) 匹配 pattern 并获取这一匹配。
所获取的匹配可以从产生的 Matches 集合得到
– (?:pattern) 匹配 pattern 但不获取匹配结果
,也就是说这是一个非获取匹配,不进行存储供
以后使用。这在使用 " 或 " 字符 (|) 来组合一
个模式的各个部分是很有用。例如,
'industr(?:y|ies) 就是一个比 'industry|
industries' 更简略的表达式
10
中关村国际软件人才教育联盟
正则表 达式 的组成 部分
11-7
– (?=pattern) 正向预查,在任何匹
配 pattern 的字符串开始处匹配查找字
符串。这是一个非获取匹配,也就是说,
该匹配不需要获取供以后使用。例
如, 'Windows (?=95|98|NT|2000)'
能匹配 "Windows 2000" 中的
"Windows" ,但不能匹配 "Windows
3.1" 中的 "Windows" 。当找到一个匹
配后,从 Windows 后面开始进行下一次
的检索匹配
11
中关村国际软件人才教育联盟
正则表 达式 的组成 部分
11-8
– (?!pattern) 负向预查,在任何不
匹配 pattern 的字符串开始处匹配查找
字符串。这是一个非获取匹配,也就是说
,该匹配不需要获取供以后使用。例如‘
Windows (?!95|98|NT|2000)’ 能匹配
“ Windows 3.1” 中的
“ Windows” ,但不能匹配
“ Windows 2000” 中的
“ Windows” 。当找到一个匹配后,从
Windows 后面开始进行下一次的检索匹
配 12
中关村国际软件人才教育联盟
正则表 达式 的组成 部分
11-9
– \xn 匹配 n ,其中 n 为十六进制转义值。
十六进制转义值必须为确定的两个数字长。例
如, '\x41' 匹配 "A" 。 '\x041' 则等价于
'\x04' & "1" 。正则表达式中可以使用 ASCII
编码
– \num 匹配 num ,其中 num 是一个正整数。
对所获取的匹配的引用。例如,‘ (.)\1’ 匹配两
个连续的相同字符
– \un 匹配 n ,其中 n 是一个用四个十六进
制数字表示的 Unicode 字符。例如, \u00A9
匹配版权符号 (?)
13
中关村国际软件人才教育联盟
正则表 达式 的组 成部分
11-10
JavaScript 中的正则表达式
– 格式: /pattern/flags
– 参数说明:
pattern -- 一个正则表达式文本
flags -- 如果存在,将是以下值:
g: 全局匹配
i: 忽略大小写进行匹配
gi: 以上组合
– 例如:
– /perl/ 找到含有 perl 的字符串
– /abc/i 找寻符合 abc 的字符串而且不考虑这
些字符串的大小写
– /[^\u4E00-\u9FA5]/g 只能是中文字符
14
中关村国际软件人才教育联盟
正则表达 式的 组成部 分
11-11
各种操作符的运算优先级
– 相同优先级的从左到右进行运算,不同优先级的运算
先高后低。各种操作符的优先级从高到低如下:
– 操作符 描述
– \ 转义符
– (), (?:), (?=), [] 圆括号和方括号
– *, +, ?, {n}, {n,}, {n,m} 限定符
– ^, $ 位置和顺序
– | “ 或”操作
15
中关村国际软件人才教育联盟
16
中关村国际软件人才教育联盟
18
中关村国际软件人才教育联盟
19
中关村国际软件人才教育联盟
20
中关村国际软件人才教育联盟
21
中关村国际软件人才教育联盟
22
中关村国际软件人才教育联盟
23
中关村国际软件人才教育联盟
24
中关村国际软件人才教育联盟
25
中关村国际软件人才教育联盟
26
中关村国际软件人才教育联盟
27
中关村国际软件人才教育联盟
28
中关村国际软件人才教育联盟
29
中关村国际软件人才教育联盟
30
中关村国际软件人才教育联盟
32
中关村国际软件人才教育联盟
– // 用 Pattern 的 split() 方法 把字 符串 按“ /” 分割
– String[] result = p.split( "Kevin has
seen 《 LEON 》 seveal times,because it is a good
film." +"/ 凯文已 经看 过《这 个杀 手不太 冷》 几次了 ,因为 它
是一 部 " +" 好电影。 / 名词 : 凯文。 ");
– for (int i=0; i<result.length; i++)
– System.out.println(result[i]);
– }
– }
34
中关村国际软件人才教育联盟
35
中关村国际软件人才教育联盟
37
中关村国际软件人才教育联盟
38
中关村国际软件人才教育联盟
41
中关村国际软件人才教育联盟
46
中关村国际软件人才教育联盟
48
中关村国际软件人才教育联盟
检验 Email 地址的 小程 序
4-1
import java.util.regex.*;
public class Email {
– public static void main(String[] args) throws
Exception {
– String input = args[0];
– // 检测输 入的 EMAIL 地址是 否以 非法 符号 “ .” 或“ @” 作为
起始 字符
– Pattern p = Pattern.compile("^\\.|^\\@");
– Matcher m = p.matcher(input);
– if (m.find()){
– System.err.println("EMAIL 地址不能 以 '.' 或 '@' 作为起
始字 符 ");
– }
– // 检测是否 以“ www.” 为起 始
– p = Pattern.compile("^www\\.");
– m = p.matcher(input);
– if (m.find()) {
– System.out.println("EMAIL 地址不 能以 'www.' 起始 "); 49
中关村国际软件人才教育联盟
检验 Email 地址的 小程 序
4-2
– // 检测是 否包含非法 字符
– p = Pattern.compile("[^A-Za-z0-9\\.\\@_\\-
~#]+");
– m = p.matcher(input);
– StringBuffer sb = new StringBuffer();
– boolean result = m.find();
– boolean deletedIllegalChars = false;
– while(result) {
– // 如果 找到了非法 字符那么 就设下标记
– deletedIllegalChars = true;
– // 如果 里面包含非 法字符如 冒号双引号 等,那么就
把他们消 去,加到 SB 里面
– m.appendReplacement(sb, "");
– result = m.find();
– }
50
中关村国际软件人才教育联盟
检验 Email 地址的 小程 序
4-3
– m.appendTail(sb);
– input = sb.toString();
– if (deletedIllegalChars) {
– System.out.println(" 输入的 EMAIL 地
址里包 含有 冒号、 逗号 等非 法字符 ,请 修
改 ");
– System.out.println(" 您现在的 输入 为 :
"+args[0]); System.out.println(" 修改后
合法的 地址 应类似 : "+input);
– }
– }
}
51
中关村国际软件人才教育联盟
检验 Email 地址的 小程 序
4-4
例如 ,我 们在命令 行输入: java Email
www.kevin@163.net ,那么输 出结 果将会 是:
– EMAIL 地址不 能以 'www.' 起始
如果 输入 的 EMAIL 为 @kevin@163.net ,则输
出为 :
– EMAIL 地址不 能以 '.' 或 '@' 作为起 始字符
当输 入为 : cgjmail#$%@163.net ,那么输 出
是:
– 输入的 EMAIL 地址里包 含有冒号、 逗号等非法字 符,请
修改
– 您现在的 输入为 : cgjmail#$%@163.net 修改后合法
的地址应 类似 : cgjmail@163.net
52
中关村国际软件人才教育联盟
正则 表达式 应用 3-1
检查邮政编码
boolean checkPostcode(){
– Pattern p=Pattern.compile("[0-9]{6}");
– Matcher m=p.matcher(inputStr);
– if (!m.matches()){
– System.out.println("**** 邮政编码格式不符!
*****");
– return false;
– }
– return true;
}
“[0-9]{6}” 的意思:一个 [] 只能允许匹配单个字符。
0-9 表示 0 到 9 之间的任意数字, {} 大括号表示匹
配次数,这里就表示匹配 6 次,即必须有 6 个数字
53
中关村国际软件人才教育联盟
正则 表达式 应用 3-2
检查 EMAIL
boolean checkEmail(){
– Pattern p=Pattern.compile("[0-9A-Za-
z]+@([0-9a-zA-Z]+.){1,2}(com|net|cn|
com.cn)");
– Matcher m=p.matcher(inputStr);
– if(!m.matches()){
– System.out.println("**** 电子邮件格式不符
! *****");
– return false;
– }
– return true;
} 54
中关村国际软件人才教育联盟
正则 表达式 应用 3-3
检查 IP 地址
boolean ipValid(String s) {
– String regex0="(2[0-4]\\d)" + "|(25[0-5])";
– String regex1="1\\d{2}";
– String regex2="[1-9]\\d";
– String regex3="\\d";
– String regex= "("+regex0+")|("+regex1+")|
("+regex2+")|("+regex3+")";
regex="("+regex+").("+regex+").("+regex+").("+r
egex+")";
– Pattern p=Pattern.compile(regex);
– Matcher m=p.matcher(s);
– return m.matches();
}
55
中关村国际软件人才教育联盟
常用 正则表 达式 10-1
验证日期格式为 YYYY-MM-DD 的正则表达
式为:
– (([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-
9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-
(((0[13578]|1[02])-(0[1-9]|[12][0-9]|
3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|
(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-
9]{2})(0[48]|[2468][048]|[13579][26])|
((0[48]|[2468][048]|[3579][26])00))-02-29)
56
中关村国际软件人才教育联盟
常用 正则表 达式 10-2
验证日期格式为 DD/MM/YYYY 的正则表达
式为:
– (((0[1-9]|[12][0-9]|3[01])/((0[13578]|
1[02]))|((0[1-9]|[12][0-9]|30)/(0[469]|11))|
(0[1-9]|[1][0-9]|2[0-8])/(02))/([0-9]{3}[1-
9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-
9]{2}|[1-9][0-9]{3}))|(29/02/(([0-
9]{2})(0[48]|[2468][048]|[13579][26])|
((0[48]|[2468][048]|[3579][26])00)))
57
中关村国际软件人才教育联盟
常用 正则表 达式 10-3
匹配中文字符的正则表达式: [\u4e00-
\u9fa5]
匹配双字节字符 ( 包括汉字在内 ) : [^\x00-
\xff]
应用:计算字符串的长度(一个双字节字符长
度计 2 , ASCII 字符计 1 )
– String.prototype.len=function(){return
this.replace([^\x00-\xff]/g,"aa").length;}
常用 正则表 达式 10-4
匹配首尾空格的正则表达式: (^\s*)|(\s*$)
应用: javascript 中没有像 vbscript 那样
的 trim 函数,我们就可以利用这个表达式来
实现,如下: String.prototype.trim =
function() { return this.replace(/(^\s*)|
(\s*$)/g, ""); }
常用 正则表 达式 10-5
利用正则表达式去除字串中重复的字符的算
法程序:
– var s="abacabefgeeii"
– var s1=s.replace(/(.).*\1/g,"$1")
– var re=new RegExp("["+s1+"]","g")
– var s2=s.replace(re,"")
– alert(s1+s2) // 结果为: abcefgi
– 思路是使用后向引用取出包括重复的字符,再以
重复的字符建立第二个表达式,取到不重复的字
符,两者串连。这个方法对于字符顺序有要求的
字符串可能不适用
60
中关村国际软件人才教育联盟
常用 正则表 达式 10-6
利用正则表达式从 URL 地址中提取文
件名的 javascript 程序如下,结果为
page1
– s=http://www.9499.net/page1.htm
–
s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$
2")
– alert(s)
61
中关村国际软件人才教育联盟
常用 正则表 达式 10-7
利用正则表达式限制网页表单里的文本
框输入内容:
用正则表达式限制只能输入中文:
– onkeyup="value=value.replace(/[^\
u4E00-\u9FA5]/g,'')“
– onbeforepaste="clipboardData.setD
ata('text',clipboardData.getData('tex
t').replace(/[^\u4E00-\u9FA5]/g,''))"
62
中关村国际软件人才教育联盟
常用 正则表 达式 10-8
用正则表达式限制只能输入全角字符:
– onkeyup="value=value.replace(/[^\
uFF00-\uFFFF]/g,'')“
– onbeforepaste="clipboardData.setD
ata('text',clipboardData.getData('tex
t').replace(/[^\uFF00-\uFFFF]/g,''))"
63
中关村国际软件人才教育联盟
常用 正则表 达式 10-9
用正则表达式限制只能输入数字:
– onkeyup="value=value.replace(/[^\
d]/g,'')“
– onbeforepaste="clipboardData.setD
ata('text',clipboardData.getData('tex
t').replace(/[^\d]/g,''))"
64
中关村国际软件人才教育联盟
常用 正则表 达式 10-10
用正则表达式限制只能输入数字和英文
:
– onkeyup="value=value.replace(/[\W
]/g,'') “
– onbeforepaste="clipboardData.setD
ata('text',clipboardData.getData('tex
t').replace(/[^\d]/g,''))"
65
中关村国际软件人才教育联盟
小结
66