`
searun
  • 浏览: 176565 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

[跟我学正则表达式] 3. 匹配字符集合

阅读更多

 

在本章中你将看到如何处理字符集合。不像“ . ”符号仅仅是匹配特定的单个字符(前一章中学到的),集合可以使得选择更多字符,或者是一个字符区间。

 

匹配几个字符

在上一节已经学习到,“ . ”可以用来匹配任何一个字符。在上一节的最后一个例子中,“ .a ”用来匹配“ na ”和“ sa ”,也就是说“ . ”匹配了“ n ”和“ s ”。假设现在还有一个名为“ ca1.xls ”的文件,那如何继续只是匹配 na sa 呢?因为“ . ”能够匹配 c ,所以这个文件名也会被匹配。

为了能够匹配 n 或者 s 而不包括其他字符,则你可能只是想匹配这两个字符。在正则表达式中,匹配一组定义好的字符可以使用“ [ ”“ ] ”元字符。在这两个元字符之间的字符组,都可以作为一个匹配字符(但是不是全部)。

下面是对上个例子的一个修改版本:

文本
sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
ca1.xls

正则表达式
[ns]a.\.xls

结果
sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
ca1.xls
分析

这里的正则表达式是使用 [ns] 开始的。这将匹配 n 或者 s (而不是 c 或者其他字符)。 [ ] 则不匹配任何字符,这里用来定义集合。 a 匹配字面意义上的 a ,“ . ”则匹配任何一个字符,“ \. ”匹配“ . ”,而 xls 匹配字面意义上的 xls 。当使用此模式的时候,只有期望的文件名才会匹配。

 

注意:实际上[ns]a.\.xls也不是很准确。如果有一个 usa1.xls 的文件,也将会匹配。解决这个问题的方法涉及到位置匹配,将在第六章中介绍。

就如你所看到的,测试一个正则表达式实际上是很复杂的。检测一个模式是否匹配你想要的这是很容易的。最大的挑战在于是否不想要的就不会匹配上。

字符组一般可以用于不考虑大小写的搜索功能中,如下例:

文本

The phrase "regular expression" is often
abbreviated as RegEx or regex.

正则表达式
[Rr]eg[Ee]x

结果
The phrase "regular expression" is often
abbreviated as RegEx or regex .
分析

这里使用的模式包含了两个字符组: [Rr] 匹配 R r [Ee] 匹配 E e 。这样, RegEx regex 都是匹配的。尽管如此, REGEX 还是不能匹配。

 

如果你只是想使用不区分大小写的匹配,上面的技术实际上是没有必要的。这种匹配方式只是在部分不区分大小写的时候有用。

 

使用字符组区间

让我们重新来看上面的例子。最后使用的模式,[ns]a.\.xls,还有一个问题。如果有一个文件名为sam.xls怎么办?这也同样可以匹配,因为“ . ”匹配所有的字符,而不仅仅是数字。

下面使用字符组来解决这个问题:

文本
sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls
ca1.xls

正则表达式
[ns]a[0123456789]\.xls

结果
sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls
ca1.xls
分析

在这个例子中,模式被修改成第一个字母必须是 n 或者 s ,而第二个字母必须是 a ,地三个字母则需要是数字( [0123456789] )。注意到最后的 sam.xls 并没有被匹配,这是因为字母 m 不匹配任何数字字符。

在使用正则表达式的时候,你可能会发现需要经常指定字符的范围(如 0 9 A Z )。为了简化字符区间的使用,正则表达式提供了一个特殊的元字符: - (连字符),用来指示区间。

下面是一个相同的例子,只是这次采用了区间的方式:

文本

sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls
ca1.xls

正则表达式
[ns]a[0-9]\.xls

结果
sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls
ca1.xls
分析

模式 [0-9] 和模式[0123456789]的功能是一样的,所以当然结果也是一样的。

区间不仅仅限于数字。下面的都是合法的区间:

  • A-Z 匹配所有的 A Z 的大写字符。
  • a-z 匹配所有的 a a 的小写字符。
  • A-F 匹配A到F的大写字符。
  • A-z 匹配从 ASCII A ASCII z 的所有字符(你可能从来没有用过这个模式,因为这个模式不仅仅匹配所有字母,还匹配包含在 ASCII 表中 A z 中的字符,如 [ ^ 等)。

 

任何两个字符都可以作为区间的开始和结束。实际上,区间总是一些数字或者字符的集合。

需要注意的是,提供的区间不要结束的字符 ASCII 码比开始的 ASCII 码字还小,如 [3-1] 。这将不能工作,而且经常使得整个模式不能工作。

另外, - (连字符)仅仅只是在区间中才是元字符。而在集合之外, - 则是字面上的意思,匹配“ - ”,此时没有必要进行转义。

可以在一个集合中使用多个字符区间。如下面的模式匹配所有的大小写字母和数字。

[A-Za-z0-9]

这个模式实际上是下面的简写:

[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890]

就像你所看到的,区间使得正则表达式更加简洁。

下面是一个查找 RGB 值的例子(颜色通过十六进制的表示法,用来表示红色、绿色和蓝色的分量)。在 Web 页面上, RGB 值被指定为#000000 (黑), #FFFFFF (白), #FF0000 (红)等等。 RGB 值可以为大写或者小写,所以#FF00ff (品红) 也是合法的。下面是个例子:

文本

<BODY BGCOLOR="#336633" TEXT="#FFFFFF"
      MARGINWIDTH="0" MARGINHEIGHT="0"
      TOPMARGIN="0" LEFTMARGIN="0">

正则表达式
#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]

结果
<BODY BGCOLOR="#336633 " TEXT="#FFFFFF "
      MARGINWIDTH="0" MARGINHEIGHT="0"
      TOPMARGIN="0" LEFTMARGIN="0">
分析

这个模式中,包含了“ # ”作为字面字符,然后是六个重复的[0-9A-Fa-f]字符集合。这将匹配 # 后接六个字符,其中每个都必须是数字或者 A F (无论是大写还是小写)。

 

非字符集的匹配

字符集合一般用于指定一组需要匹配的字符。但是有些时候,你的需求刚好相反——一组你不想匹配的字符。换句话说,任何字符除了这里定义的。

可以通过穷举所有想要的字符来做匹配(当需要的字符很多的时候长度将会很长),可以通过对于字符集合的否定来实现。下面是个例子:

文本
sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls
ca1.xls
正则表达式
[ns]a[^0-9]\.xls
结果
sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls
ca1.xls
分析

这里的模式和前面一个例子中的完全相反。 [0-9] 匹配所有的数字,而 [^0-9] 则匹配所有的非数字。也就是说,[ns]a[^0-9]\.xls可以匹配sam.xls,但不能匹配na1.xls, na2.xls 或者 sa1.xls。

 

注意,^字符是将字符集合中的所有字符都取消匹配,而不仅仅只是此字符后的字符。

 

小结

元字符“ [ ”和“ ] ”用来定义一组字符,其中的每个字符都可以匹配。字符集合可以通过枚举,也可以通过元字符“ - ”来指定区间。字符集合还可以通过“ ^ ”来否定,这使得模式可以匹配除字符集合中的所有字符。

 

2
0
分享到:
评论

相关推荐

    java正则表达式.zip

    Java正则表达式是Java编程语言中用于处理字符串的强大工具,它基于模式匹配的概念,能够高效地进行文本搜索、替换和解析。在Java中,正则表达式主要通过`java.util.regex`包来实现,提供了Pattern和Matcher两个核心...

    正则表达式.rar 正则表达式.rar

    正则表达式,简称为正则或regex,是一种强大的文本处理工具,用于匹配、查找、替换和处理字符串。它在编程、数据验证、文本编辑器等多个领域广泛应用,是IT行业中不可或缺的基础知识。 正则表达式的基本概念: 1. *...

    正则表达式大全.docx

    正则表达式是一种强大的文本处理工具,用于在字符串中进行模式匹配和搜索替换操作。它由特殊字符(称为“元字符”)和普通字符组成,能够灵活地定义要查找的模式。以下是一些常见的正则表达式模式及其用途: 1. ...

    最全正则表达式教程、最好正则表达式教程.pdf

    例如,`hi`可以匹配字符串`"hi"`。 2. **忽略大小写**: 在大多数正则表达式引擎中,可以通过设置选项来忽略大小写差异。例如,如果设置了忽略大小写的选项,那么`hi`将匹配`hi`, `HI`, `Hi`, `hI`等。 3. **单词...

    正则表达式.rar || 正则表达式.rar

    正则表达式,简称为正则,是一种强大的文本处理工具,用于在字符串中进行模式匹配和搜索替换。在计算机科学和编程领域,正则表达式是处理文本的基础,广泛应用于数据验证、搜索、替换和提取等多种场景。下面将详细...

    正则表达式chm.zip

    7. **边界匹配**:`^`匹配字符串的开始,`$`匹配字符串的结束,`\b`匹配单词边界。 8. **转义字符**:`\`用于对特殊字符进行转义,使其恢复为普通字符。 正则表达式的应用场景: 1. **数据验证**:在表单提交时,...

    易语言模块彗星正则表达式类.rar

    3. **查找函数**:在字符串中查找所有符合正则表达式的位置,返回匹配结果的数组。 4. **替换函数**:将字符串中符合正则表达式的部分替换为指定的字符串。 5. **分组函数**:如果正则表达式中有捕获组,该函数...

    Linux在合集中使用正则表达式来匹配查找.zip

    grep支持基本正则表达式,而egrep支持扩展正则表达式,fgrep则仅支持基本字符串匹配。grep的选项如`-i`忽略大小写,`-v`反向匹配,`-n`显示匹配行的行号,`-c`计数匹配行数,这些都能增强我们的查找能力。 最后,...

    易语言正则表达式类匹配中文

    正则表达式是用于匹配字符串模式的一种强大工具,它使用特定的语法来描述字符串的特征,如单个字符、字符集、重复次数等。在易语言中,正则表达式类提供了多种方法来操作和分析字符串: 1. **创建**:创建正则...

    正则表达式不包涵特殊字符(除了 指定字符 以外)

    在探讨如何利用正则表达式来判断一个字符串除指定字符外不包含其他特殊字符之前,我们首先需要了解正则表达式的基本概念以及本场景中的具体需求。 ### 正则表达式简介 正则表达式是一种强大的文本处理工具,能够...

    正则表达式.rar

    3. **匹配方法**:Matcher提供了`matches()`、`find()`、`lookingAt()`等方法来检查字符串是否符合正则表达式。 4. **替换方法**:`replaceAll()`、`replaceFirst()`用于替换字符串中匹配的部分。 5. **分组与捕获**...

    Python正则表达式字符.xlsx

    Python正则表达式字符.xlsx

    regex-正则表达式教程.pdf

    例如,正则表达式"a"会匹配字符串中首次出现的字母"a",而"cat"会匹配包含连续字母"c"、"a"和"t"的字符串。 正则表达式的应用广泛,但不同的正则表达式引擎可能存在差异。教程主要关注的是Perl 5类型的引擎,因为这...

    关于在LABVIEW中使用正则匹配公式.vi

    正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文本时...

    史上最好的正则表达式教程.pdf

    10. 贪婪与懒惰:正则表达式的匹配默认是贪婪的,尽可能多地匹配字符;而懒惰匹配则相反,尽可能少地匹配字符。可以通过在重复限定符后添加问号来实现懒惰匹配,如.*?。 11. 处理选项:可以在正则表达式中设置各种...

    正则表达式工具.zip

    正则表达式(Regular Expression,简称regex)是用于匹配字符串的一种模式,广泛应用于文本处理、数据验证、搜索和替换等场景。在这个“正则表达式工具.zip”压缩包中,包含了一个工具,它能帮助开发者自动生成常见...

    正则表达式文档.docx

    正则表达式是一种强大的模式匹配工具,可以用来描述复杂的字符模式,并且可以用来匹配各种类型的字符串。在JavaScript中,正则表达式是由一个RegExp对象表示的,可以使用一个RegExp()构造函数来创建RegExp对象,也...

    Java正则表达式详解.pdf

    例如,正则表达式`c.t`将匹配所有形如“cat”、“cot”、“cut”等的字符串。 #### 2.2 方括号符号(`[]`) 方括号`[]`用于表示字符集合,即匹配其中的任意一个字符。例如,“t[aeio]n”将匹配“tan”、“ten”、...

Global site tag (gtag.js) - Google Analytics