|
楼主 |
发表于 2011-9-2 13:03
|
显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
匹配多个字符
单个字符(比如“j”)、单个任意字符(即“.”)、字符组(比如“[abcde]”)、特定字符类型(比如“\d”)等前面学习的内容都只能代表单个字符,如果需要匹配的是多个字符该如何表示呢?
1、一个或多个字符
例17把数据列表中的文件名全部替换为文件.doc。
分析:无论“文”或“存”后是一个“档”字,还是连续的几个“档” 字,它们组成的字符串都是符合要求的字符串。要求:1、第1字符是“文”或“存”,2、第1个字符后可以是一个“档”字,也可以是重复的多个“档”字。
解决:我们可以在单个字符(比如“j”)、字符组(比如“[abcde]”)、特定字符类型(比如“\d”)、单个任意字符(即“.”)后面加上“+”,来表示”+”前面的字符可以是一个,也可以是重复的多个。例如”a+”可以代表“a”或者”aa”或者”aaa” 或者”aaaa”……,即”a+” 可以代表单个“a”,也可以代表无数个“a”,所以:
正则表达式:” [文存]档+”
替换为:”文件”
说明:前两个数据没有更改,因为“文”或“存”后没有“档”字,而”+”要求它前面的字符至少出现一次。
例18 把数据列表中的文件名改为大写BOOK.xls。演示“+”和字符组联合使用的情况。
“[12]+”代表数字1或数字2,也可以代表由数字1、2组成的任意长度的字符串。把代码中的正则表达式改为” book[12]“看看。
例19 把数据列表中的文件名改为大写BOOK.xls。演示“+”和元字符”\d”联合使用的情况。“\d+”代表任意一个数字,也可以代表由任意数字组成的任意长度的字符串。把代码中的正则表达式改为”book\d“看看。
2、匹配零个或多个字符
例20、把数据列表中的文件名全部替换为文件.doc。
分析:无论 “文”或“存”后没有“档”字,或者是一个“档”字,或者是连续的几个“档” 字,它们组成的字符串都是符合要求的字符串。要求:1、第1字符是“文”或“存”,2、第1个字符后可以没有“档”字,也可以是一个“档”字,也可以是重复的多个“档”字。
解决:我们可以在单个字符(比如“j”)、字符组(比如“[abcde]”)、特定字符类型(比如“\d”)、单个任意字符(即“.”)后面加上“*”,来表示”*”前面的字符可以没有,也可以是一个,也可以是重复的多个。例如”a*”可以代表 ”” (即什么也没有)或者”a”或者”aa”或者”aaa” 或者”aaaa”……,即”a*” 可以代表单个“a”,也可以代表无数个“a”,也可以表示””( 即什么也没有)。所以:
正则表达式:” [文存]档*”
替换为:”文件”
说明:前两个数据也更改了,因为”*”允许它前面的字符一次也不出现,而“文”或“存”后没有“档”字,是符合要求的。”*”除了允许它前面的字符出现一次或者出现多次,还允许它前面的字符一次也不出现,可以看出”*”实际是把”+”的要求进一步放宽了。
3、匹配零个或一个字符 串
例21把数据列表中的文件名全部替换为文件.doc。
分析:无论 “文”或“存”后没有“档”字,或者是一个“档”字,它们组成的字符串都是符合要求的字符串。要求:1、第1字符是“文”或“存”,2、第1个字符后可以没有“档”字,也可以是一个“档”字。
解决:我们可以在单个字符(比如“j”)、字符组(比如“[abcde]”)、特定字符类型(比如“\d”)、单个任意字符(即“.”)后面加上“?”,来表示”?”前面的字符可以没有,也可以是一个。例如”a?”可以代表 ”” (即什么也没有)或者”a”,即”a?” 能代表一个“a”,也可以表示””( 即什么也没有),但不能代表连续的几个“a” 字。所以:
正则表达式:” [文存]档?”
替换为:”文件”
说明:前四个数据都更改了,因为“文”或“存”后没有“档”字,都是符合”档?”要求的。
后三个出现了意想不到的结果,因为这三个文件名中,“文”或“存”后有一个以上“档”字,违反了”档?”允许”?”前的字符最多出现一次的条件。出现这样的结果还牵扯到贪婪匹配和惰性匹配的问题,后面再说。
4、匹配指定数目字符
尽管“?”、“+”、“*”可以解上面的问题,但是,它们并不完善:1.没有办法限制最多重复多少个字符,比如说,我们要匹配手机号码,那么应该是 11 个数字,而“+”和“*”会匹配尽可能多的数字,不管是 17 个还是 18 个都认为是正确的。2.没有办法指定最少匹配多少个字符,“+”、“*”、“?”,所能提供的最少字符,要么零个,要么一个。
例22、暂且不考虑区号,把数据列表中正确的手机号替换为”正确“
分析:电话号码为8位,就是说“-”后是8位数字的才是正确的。要求:1、第1个字符是“-”,2、“-”后是8位由任意数字组成的字符串
解决:正则表达式中,可以在 单个字符(比如“j”)、字符组(比如“[abcde]”)、特定字符类型(比如“\d”)、单个任意字符(即“.”) 后面加“{数字}”,来表示指定个数的字符组成的字符串。例如:
”a {5}”代表5个“a”组成的字符串“aaaaa”,”\d{3}”代表由数字0、1、2、3、4、5、6、7、8、9组成的任意三位数。所以:
正则表达式:\-\d{8}
替换为:“正确”
注意:正则表达式中的”-“没有用在[]里,所以它是普通字符,可以直接使用,代表它本身。加上”\”也不错。
说明:例子使用”test”方法,就像前面说的,”test”方法只验证是否找到符合要求的字符串,如果找到的字符串符合正则表达式的要求它就返回“true”,否则返回“false”。
例23、暂且不考虑区号,把数据列表中正确的手机号替换为”正确“
分析:电话号码为8位或7位都是正确的,就是说“-”后是8位数字或7位数字,即“-”后的数字字符串最短是7位,最长是8位。要求:1、第1个字符是“-”,2、“-”后是最长8位,最短7位由任意数字组成的字符串。
解决:正则表达式中,可以在 单个字符(比如“j”)、字符组(比如“[abcde]”)、特定字符类型(比如“\d”)、单个任意字符(即“.”) 后面加“{最小数目,最大数目}”,来限制其前的字符可以最少是几个和最多有几个。例如:”a {3,5}”代表 “aaa”,或者 “aaaa”或者“aaaaa”,而“aa”和“aaaaaa”都是不符合要求的,因为它们由2个和6个“a”组成,超出了”{3,5}”允许的范围(3到5各之间)。”\d{2,3}”代表由数字0、1、2、3、4、5、6、7、8、9组成的任意的两位数或三位数。所以:
正则表达式:-\d{7,8}
替换为:“正确”
例24、考虑区号,把数据列表中正确的手机号替换为”正确“
分析:区号为3位或4位数字,电话号码为8位或7位都是正确的,要求:1、字符“-”前是最长4位,最短3位由任意数字组成的字符串,2、“-”后是最长8位,最短7位由任意数字组成的字符串。所以:
正则表达式:”\d{3,4}-\d{7,8}”
替换为:“正确”
说明:最小数目可以是 0,所以 “{0,1}”,相当于 “?”。如果将最大数目设为空,如“\d{1,}”相当于“+”;而“{0,}”相当于“*”。
练习:找一组手机号,混入一些错误的号码,写正则表达式从中找出正确的手机号。
分析:手机号第1位必须是1,第2位可以为3或5,后面是任意9位数字。按分析的要求,我们的正则表达式应该规定以下的条件:1、第1位必须是1,2、第2位可以为3或5,3、后面必须是9位数字,这些数字可以是任意的。
|
|