RegEx教程:匹配字符集
获取完整的书
本文摘录自本·福特(Ben Forta)的皮尔逊·艾迪生(Pearson Addison-Wesley)书“学习正则表达式”,经皮尔森(©2018)许可在此处转载。有关更多信息,请访问notifyit.com/forta/infoworld。
在本课程中,您将学习如何使用RegEx(正则表达式)来处理字符集。 不像.
,它可以匹配任何单个字符,集合使您可以匹配特定的字符和字符范围。
匹配几个字符之一
如您在上一课中所学, .
与任何一个字符匹配(与任何文字字符匹配)。 在该课程的最后一个示例中, .a
用于匹配na
和sa
.
匹配n
和s
。 但是,如果还有一个名为ca1.xls的文件(包含加拿大销售数据),而您仍然只想匹配na
和sa
怎么办? .
也将匹配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
要找到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
的文件,它将也匹配(开头的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]
匹配R
和r
, [Ee]
匹配E
和e
。 这样, RegEx
和regex
都可以匹配。 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
分析
在此示例中,模式已被修改,因此第一个字符必须为n
或s
,第二个字符必须为a
,第三个字符可以为任何数字(指定为[0123456789]
)。 请注意,文件sam.xls
不匹配,因为m
与允许的字符列表(十位数字)不匹配。
使用正则表达式时,您会发现经常指定字符范围( 0
到9, A
到Z
等)。 为了简化使用字符范围,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
匹配从A
到Z
所有大写字符。 -
az
匹配从a
到z
所有小写字符。 -
AF
仅匹配大写字符A
到F
-
Az
匹配ASCIIA
和ASCIIz
之间的所有字符(您可能永远不要使用此模式,因为它还包含[
和^
等字符,它们在ASCII表中位于Z
和a
之间)。
可以将任意两个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]
重复六次。 这与#
后跟六个字符匹配,每个字符必须是一个数字或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
不匹配。
注意: ^
否定集合中的所有字符或范围,而不仅仅是前面的字符或范围。
摘要
元字符[
和]
用于定义字符集,其中任何一个必须匹配(与AND
相比, OR
)。 字符集可以显式枚举或使用-
元字符指定为范围。 字符集可以使用^
取反; 这会强制匹配除指定字符之外的任何字符。
From: https://www.infoworld.com/article/3306798/regex-tutorial-matching-sets-of-characters.html