正则表达式之字符组简记法与字符组运算

 更新时间:2023年05月28日 12:31:26   作者:gaara724  
这篇文章主要介绍了正则表达式之字符组简记法与字符组运算,用[0-9]、[a-z]等字符组,这里就为大家介绍一下,需要的朋友可以参考下

字符组简记法

用[0-9]、[a-z]等字符组,可以很方便地表示数字字符和小写字母字符。对于这类常用的字符组,正则表达式提供了更简单的记法,这就是字符组简记法(shorthands)。

常见的字符组简记法有\d、\w、\s。从表面上看,它们与[…]完全没联系,其实是一致的。其中\d等价于[0-9],其中的d代表"数字(digit)";\w等价于[0-9a-zA-Z_],其中的w代表"单词字符(word)";\s等价于[ \t\r\n\v\f](第一个字符是空格),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

妥善利用这种互补的属性,可以得到一些非常巧妙的效果,最简单的应用就是字符组[\s\S]。初看起来,在同一个字符组中并列两个互补的简记法,这种做法有点奇怪,不过仔细想想就会明白,\s和\S组合在一起,匹配的就是"所有的字符"(或者叫"任意字符")。许多语言中的正则表达式并没有直接提供"任意字符"的表示法,所以[\s\S]、[\w\W]、[\d\D]虽然看起来有点古怪,但确实可以匹配任意字符 。

关于字符组简记法,最后需要补充两点:第一,如果字符组中出现了字符组简记法,最好不要出现单独的-,否则可能引起错误,比如[\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*红色为更正

到此这篇关于正则表达式之字符组简记法与字符组运算的文章就介绍到这了,更多相关正则字符组简记法与运算内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浏览器中的正则表达式陷阱说明

    浏览器中的正则表达式陷阱说明

    js 内置对象 RegExp 我们用的很习惯 也很舒服 但是里面却有 严重的隐患 或者陷阱...原因在于 有些浏览器 对正则表达式直接量的优化.
    2010-05-05
  • 正则表达式进行页面表单验证功能

    正则表达式进行页面表单验证功能

    一般做到注册页面的时候,当用户填完信息,都需要对他们的信息进行验证,这就要用到正则表达式。本文通过实例给大家介绍正则表达式进行页面表单验证功能,一起看看吧
    2017-03-03
  • 正则表达式m修饰符(多行匹配)

    正则表达式m修饰符(多行匹配)

    m修饰符规定正则表达式可以执行多行匹配,在默认状态下,一个字符串无论是否换行只有一个开始^和结尾$,如果采用多行匹配,那么每一个行都有一个^和结尾$
    2016-12-12
  • Android中手机号、车牌号正则表达式大全

    Android中手机号、车牌号正则表达式大全

    这篇文章主要介绍了Android中手机号、车牌号正则表达式的相关资料,需要的朋友可以参考下
    2015-09-09
  • 精通JS正则表达式(推荐)

    精通JS正则表达式(推荐)

    精通JS正则表达式,讲的比较详细,学习正则表达式的朋友可以参考下。
    2010-11-11
  • UNIX/LINUX SHELL 正则表达式语法详解附使用方法

    UNIX/LINUX SHELL 正则表达式语法详解附使用方法

    一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配
    2019-11-11
  • 半小时精通正则表达式 经典实例介绍

    半小时精通正则表达式 经典实例介绍

    想必很多人都对正则表达式都头疼.今天,我以我的认识,加上网上一些文章,希望用常人都可以理解的表达方式.来和大家分享学习经验
    2012-09-09
  • 通过正则表达式验证IP和端口格式的正确性

    通过正则表达式验证IP和端口格式的正确性

    这篇文章主要介绍了正则表达式验证IP和端口格式的正确性,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • javascript中使用正则表达式进行字符串验证示例

    javascript中使用正则表达式进行字符串验证示例

    我写的一个表达式验证示例:功能如下:用户名,不能为空;密码6为数字;密码确认,两次输入密码必须相同;身份证号码必须是15位,或者是18位,最末尾也可以是X
    2013-05-05
  • Kotlin版正则表达式及其常见使用代码举例

    Kotlin版正则表达式及其常见使用代码举例

    正则表达式是处理字符串的强大工具,Kotlin 提供了便捷的 API 支持正则表达式的使用,这篇文章主要介绍了Kotlin版正则表达式及其常见使用代码举例的相关资料,需要的朋友可以参考下
    2026-05-05

最新评论