获取完整的书
学习正则表达式 本文摘录自本·福特(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