RegEx教程:匹配字符集

学习正则表达式
建议零售价$ 34.99
看见

本文摘录自本·福特(Ben Forta)的皮尔逊·艾迪生(Pearson Addison-Wesley)书“学习正则表达式”,经皮尔森(©2018)许可在此处转载。有关更多信息,请访问notifyit.com/forta/infoworld。

在本课程中,您将学习如何使用RegEx(正则表达式)来处理字符集。 不像. ,它可以匹配任何单个字符,集合使您可以匹配特定的字符和字符范围。

匹配几个字符之一

如您在上一课中所学, . 与任何一个字符匹配(与任何文字字符匹配)。 在该课程的最后一个示例中, .a用于匹配nasa . 匹配ns 。 但是,如果还有一个名为ca1.xls的文件(包含加拿大销售数据),而您仍然只想匹配nasa怎么办? . 也将匹配c ,因此文件名也将匹配。

[ 小心! 每个开发人员都应避免的8个职业陷阱 要成为一名真正的软件开发人员,必须阅读7本书 即使是经验丰富的开发人员,也会犯15个菜鸟错误 | 通过InfoWorld的App Dev Report新闻通讯了解编程方面的热门话题。 ]

文本

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

正则表达式

.a.\.xls

结果

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

要找到ns ,您不想匹配任何字符,只想匹配这两个字符。 在正则表达式中,使用元字符[]定义了一组字符。 []定义一个字符集,它们之间的所有内容都是该字符集的一部分,并且任何一个字符集成员都必须匹配(但不是全部)。

这是上一课中该示例的修订版:

文本

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]开头; 这匹配ns (但不匹配c或任何其他字符)。 开头[和结尾]不匹配任何字符,它们定义了集合。 文字a匹配a . 匹配任何字符\. 匹配. ,并且文字xlsxls匹配。 使用此模式时,只有三个所需的文件名匹配。

注意:实际上, [ns]a.\.xls也不太正确。 如果存在一个名为usa1.xls的文件,它将也匹配(开头的u将被忽略,而sa1.xls将会匹配)。 该问题的解决方案涉及位置匹配,这在第6课“位置匹配”中进行了介绍。

提示:如您所见,测试正则表达式可能很棘手。 验证模式是否符合您的要求非常容易。 真正的挑战在于验证您是否还收到了不需要的比赛。

字符集通常用于使搜索(或其特定部分)不区分大小写。 例如:

文本

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]匹配Rr[Ee]匹配Ee 。 这样, RegExregex都可以匹配。 REGEX ,但是,不匹配。

提示:如果您使用不区分大小写的匹配,则不需要使用此技术。 仅当执行部分区分大小写的区分大小写的搜索时,才使用这种类型的匹配。

使用字符集范围

让我们再次看一下文件列表示例。 上次使用的模式[ns]a.\.xls具有另一个问题。 如果文件名为sam.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

分析

在此示例中,模式已被修改,因此第一个字符必须为ns ,第二个字符必须为a ,第三个字符可以为任何数字(指定为[0123456789] )。 请注意,文件sam.xls不匹配,因为m与允许的字符列表(十位数字)不匹配。

使用正则表达式时,您会发现经常指定字符范围( 0到9, AZ等)。 为了简化使用字符范围,RegEx提供了特殊的元字符- (连字符)来指定范围。

以下是同一示例,这次使用范围:

文本

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] ,因此结果与前面的示例相同。

范围不限于数字。 以下是所有有效范围:

  • AZ匹配从AZ所有大写字符。
  • az匹配从az所有小写​​字符。
  • AF仅匹配大写字符AF
  • Az匹配ASCII A和ASCII z之间的所有字符(您可能永远不要使用此模式,因为它还包含[^等字符,它们在ASCII表中位于Za之间)。

可以将任意两个ASCII字符指定为范围的开始和结束。 但是,实际上,范围通常由一些或所有数字和一些或所有字母字符组成。

提示:使用范围时,请注意不要提供小于开始范围的结束范围(如[3-1] )。 这将行不通,并且通常会阻止整个模式运行。

注: -连字符)是一个特殊的元字符,因为它是唯一之间使用时元字符[] 。 在集合之外, -是文字,将仅与-匹配。 因此, -不需要转义。

多个范围可以组合在一个集合中。 例如,以下模式匹配任何大写或小写字母数字字符,但不匹配既不是数字字符也不是字母字符的任何字符:

[A-Za-z0-9]

此模式是

[ABCDEFGHIJKLMNOPQRSTUVWXYZabcde
➥fghijklmnopqrstuvwxyz01234567890]

如您所见,范围使RegEx语法更加简洁。

以下是另一个示例,这次查找RGB值(以十六进制表示法指定的颜色代表用于创建颜色的红色,绿色和蓝色的数量)。 在网页中,RGB值指定为#000000 (黑色), #ffffff (白色), #ff0000 (红色),依此类推。 RGB值可以大写或小写指定,因此#FF00ff (洋红色)也是合法的。 这是一个取自CSS文件的示例:

文本

body {
  background-color: #fefbd8;
}
h1 {
  background-color: #0000ff;
}
div {
  background-color: #d0f4e6;
}
span {
  background-color: #f08970;
}

正则表达式

#[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 {
  background-color: #fefbd8 ;
}
h1 {
  background-color: #0000ff ;
}
div {
  background-color: #d0f4e6 ;
}
span {
  background-color: #f08970 ;
}

分析

此处使用的模式包含#作为文字文本,然后将字符集[0-9A-Fa-f]重复六次。 这与#后跟六个字符匹配,每个字符必须是一个数字或AF (大写或小写)。

“除了”

字符集通常用于指定必须匹配的字符列表。 但是有时候,您想要反向输入-不想匹配的字符列表。 换句话说, 除了此处指定的列表以外的任何内容

不必枚举所需的每个字符(如果只需要几个字符,可能会很冗长),而可以使用^元字符取反字符集。 这是一个例子:

文本

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]\.xlssam.xls匹配,但与na1.xlsna2.xlssa1.xls不匹配。

注意: ^否定集合中的所有字符或范围,而不仅仅是前面的字符或范围。

摘要

元字符[]用于定义字符集,其中任何一个必须匹配(与AND相比, OR )。 字符集可以显式枚举或使用-元字符指定为范围。 字符集可以使用^取反; 这会强制匹配除指定字符之外的任何字符。

From: https://www.infoworld.com/article/3306798/regex-tutorial-matching-sets-of-characters.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值