正则表达式之字符组简记法与字符组运算实用指南
平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“正则表达式之字符组简记法与字符组运算”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
字符组简记法
在这个场景下,用[0-9]、[a-z]等字符组,能够很便于地表示数字字符和小写字母字符。对于这类常用的字符组,正则表达式提供了更轻松的记法,这就是字符组简记法(shorthands)。
理解这一步时,常用的字符组简记法有d、w、s。从表面上看,它们与[……]完全没联系,其实是一致的。其中d等价于[0-9],其中的d代表"数字(digit)";w等价于[0-9a-zA-Z_],其中的w代表"单词字符(word)";s等价于[ trnvf](第一个字符是空格),s表示"空白字符(space)"。例1-17说明了这几个字符组简记法的典型匹配。
例1-17 字符组简记法d、w、s
#如果没有原生字符串,d就必须写作\d
re.search(r"^d$", "8") != None # => True
re.search(r"^d$", "a") != None # => False
re.search(r"^w$", "8") != None # => True
re.search(r"^w$", "a") != None # => True
re.search(r"^w$", "_") != None # => True
re.search(r"^s$", " ") != None # => True
re.search(r"^s$", "t") != None # => True
re.search(r"^s$", "n") != None # => True
结合项目来看,一般印象中,单词字符似乎只包含大小写字母,但是字符组简记法中的"单词字符"不只有大小写单词,还包括数字字符和下画线_,其中的下画线_尤其值得注意:在进行数据验证时,有可能只容许输入"数字和字母",有人会偷懒用w验证,而忽略了w能匹配下画线,所以这种匹配同时不严格,[0-9a-zA-Z]才是准确的选择。
从实现思路看,"空白字符"同时不难定义,它能够是空格字符、制表符t,回车符r,换行符n等各种"空白"字符,只是不便于展现(因为显示和印刷出来都是空白)。不过这也提醒我们注意,匹配时看到的"空白"可能不是空格字符,因此,s才是准确的选择。
实际处理时,字符组简记法能够单独出现,也能够采用在字符组中,比如[0-9a-zA-Z]也能够写作[da-zA-Z],所以匹配十六进制字符的字符组能够写成[da-fA-F]。字符组简记法也能够用在排除型字符组中,比如[^0-9]就能够写成[^d],[^0-9a-zA-Z_]就能够写成[^w],代码如例1-18。
例1-18 字符组简记法与普通字符组混用
#用在普通字符组内部
re.search(r"^[da-zA-Z]$", "8") != None # => True
re.search(r"^[da-zA-Z]$", "a") != None # => True
re.search(r"^[da-zA-Z]$", "C") != None # => True
#用在排除型字符组内部
re.search(r"^[^w]$", "8") != None # => False
re.search(r"^[^w]$", "_") != None # => False
re.search(r"^[^w]$", ",") != None # => True
从实现思路看,相对于d、w和s这三个普通字符组简记法,正则表达式也提供了对应排除型字符组的简记法:D、W和S--字母完全一样,只是改为大写。这些简记法匹配的字符互补:s能匹配的字符,S一定不能匹配;w能匹配的字符,W一定不能匹配;d能匹配的字符,D一定不能匹配。例1-19示范了这几个字符组简记法的应用。
例1-19 D、W、S的采用
#d和D
re.search(r"^d$", "8") != None # => True
re.search(r"^d$", "a") != None # => False
re.search(r"^D$", "8") != None # => False
re.search(r"^D$", "a") != None # => True
#w和W
re.search(r"^w$", "c") != None # => True
re.search(r"^w$", "!") != None # => False
re.search(r"^W$", "c") != None # => False
re.search(r"^W$", "!") != None # => True
#s和S
re.search(r"^s$", "t") != None # => True
re.search(r"^s$", "0") != None # => False
re.search(r"^S$", "t") != None # => False
re.search(r"^S$", "0") != None # => True
实际处理时,妥善借助这种互补的属性,能够得到一些很巧妙的效果,最轻松的应用就是字符组[sS]。初看起来,在同一个字符组中同时列两个互补的简记法,这种做法有点奇怪,不过仔细想想就会明白,s和S组合在一起,匹配的就是"所有的字符"(或者叫"任意字符")。许多语言中的正则表达式并没有直接提供"任意字符"的表示法,所以[sS]、[wW]、[dD]虽然看起来有点古怪,但确实能够匹配任意字符。
落到代码里,关于字符组简记法,最后需补充两点:第一,如果字符组中出现了字符组简记法,最好不要出现单独的-,否则可能引起错误,比如[d-a]就很让人迷惑,在有些语言中,-会被作为普通字符,而在有些语言中,这样写会报错;第二,以上说的d、w、s的匹配规则,都是针对ASCII编码而言的,也叫ASCII匹配规则。但是,目前一些语言中的正则表达式已经兼容了Unicode字符,那么数字字符、单词字符、空白字符的范围,已经不仅仅限于ASCII编码中的字符。关于这个问题,具体细节在后文有详细的介绍,如果你现在就想知道,能够翻到第115页。
正则表达式——字符组运算
结合项目来看,以上介绍了字符组的基本功能,它们在常用的语言中都有提供;还有些语言中为字符组提供了更强大的功能,比如Java和.NET就提供了字符组运算的功能,能够在字符组内进行集合运算,在某些情况下这种功能很实用。
从实现思路看,若要匹配所有的元音字母(为讲解轻松考虑,暂时只考虑小写字母的情况),能够用[aeiou],但是要匹配所有的辅音字母却没有什么便于的办法,最直接的写法是[b-df-hj-np-tv-z],不但烦琐,而且难理解。其实,从26个字母中"减去"元音字母,剩下的就是辅音字母,如果有办法做这个"减法",就便于多了。
理解这一步时,Java语言中提供了这样的字符组:[[a-z]&&[^aeiou]],虽然初看有点古怪,但仔细看看,也不难理解。[a-z]表示26个英文字母,[^aeiou]表示除元音字母之外的所有字符(还包括大写字母、数字和各种符号),两者取交集,就得到"26个英文字母中,除去5个元音字母,剩下的21个辅音字母"。
实际处理时,.NET中也有这样的功能,只是写法不一样。同样是匹配辅音字母的字符组,.NET中写作[a-z-[aeiou]],其逻辑是:从[a-z]能匹配的26个字符中,"减去"[aeiou]能匹配的元音字母。相对于Java,这种逻辑更符合直觉,但写法却有点古怪--不是[[a-z]-[aeiou]],而是[a-z-[aeiou]]。例1-20集中演示了Java和.NET中的字符组运算。
例1-20 字符组运算
// Java
"a".matches("^[[a-z]&&[^aeiou]]$"); // => True False
"b".matches("^[[a-z]&&[^aeiou]]$"); // => False True
// .NET
Regex.IsMatch("^[a-z-[aeiou]]$", "a"); // => True False
Regex.IsMatch("^[a-z-[aeiou]]$", "b"); // => False True*红色为更正
到此这篇关于正则表达式之字符组简记法与字符组运算的文章就介绍到这了,更多相关正则字符组简记法与运算内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多兼容脚本之家!
-
09.02
智谱GLM有哪些重点-关键信息和实际影响
-
09.02
Codex 速查表
-
09.02
Codex 命令行工具
-
09.02
离盈利越来越远有哪些重点-关键信息和实际影响
-
09.02
Codex 云端版本
-
09.02
Museum Poster Design Template
-
- ASP正则匹配替换函数代码实用指南
- 09.02
-
-
-
-
-
- 紫光国微要注意什么-核心信息和使用场景
- 09.02
-
-
下载
- |
-
-
下载
- 《行尸走肉第一章》免安装中文汉化硬盘版下载
- 单机|436 MB
- 一款以动作冒险为主题的游戏
-
-
下载
- 《街头霸王X铁拳》免安装中文汉化硬盘版下载
- 单机|111MB
- 一款非常好玩的格斗游戏
-
-
下载
- |
-
-
下载
- 《暗黑破坏神3》免安装繁体中文正式版下载
- 单机|7630 MB
- 一款以角色扮演为主题的游戏
-
-
下载
- 《马克思佩恩3》免安装硬盘版下载
- 单机|27033 MB
- 一款以第三人称射击为主题的游戏