本文的目的是讨论字符类内部和外部的字符与字符类内部某些特殊字符之间的区别。 这不是一个正则表达式教程。 假设您已经熟悉基本的正则表达式概念和术语。 如果没有,您可能需要阅读一些正则表达式教程。 有关在线资源的链接,请参见文章末尾。
什么是角色类?Perl在正则表达式中使用方括号定义可以以任何顺序匹配的一类字符。 如果您的字符类为[abc]并且字符串为'cab',则匹配的第一个字符为'c',因为忽略了方括号内列出字符的顺序。
在字符类的内部和外部以及点“。”当在字符类中使用Perl时,对正则表达式中使用的大多数字符的处理方式有所不同。 似乎引起最大混乱的一个字符是点:“。”。 在字符类之外,点用于通配符匹配。 点可以匹配任何东西。 带有量词的点可以匹配不同数量的任何东西。
/.?/ (零个或一个) /.*/ (零个或多个) /.+/ (一个或多个)/。 {1,4} / (最小1,最大4)为了匹配模式中的文字点,您必须使用反斜杠对其进行转义:
$ foo =〜/\./; 注意 :您还可以使用perls \ Q修饰符来转义搜索模式中的大多数元字符。在字符类中,点没有元含义(没有特殊含义)。 它不用于通配符匹配,就像它在字符类外部一样,而是被视为文字点。 在字符类中使用时,无需对其进行转义。 如果您更喜欢以这种方式编写代码,则逃避它并不会带来伤害,但这不是必需的。
这些示例都是相同的:
/[.]//\Q.\E/
/[\.]/
当然,只有一个点的字符类会有点愚蠢,但是在某些情况下它很有用:否定的字符类。 以后再说。
特殊字符在字符类中,特殊字符集是
-] \ ^ $ ,并使用转义符进行匹配: / [\-\] \\\\ ^ \ $]似乎很明显为什么这两个字符
] \需要转义,所以我将不再讨论它们。标量数据类型符号$插入到字符类中,这意味着您可以创建动态字符类:
my $character_class = q{#!*?};
if ($foo =~ /[$character_class]/) {
...
}
^字符用于定义我上面提到的否定字符类。
否定的字符类意味着不匹配^右边的内容:
unless ($foo =~ /[^.?!]/) {
...
}
]
它非常类似于:
unless ($foo !~ /[.?!]/) {
...
}
实际上可能是相同的,但截至本文撰写时我还不确定。
随时告诉我。
由于这不是正则表达式教程,因此我将不详细讨论否定字符类。
最后一个特殊字符是连字符-。 因为它是作为字符类内部(与字符类外部)相同的范围运算符进行插值的,所以也必须对其进行转义以匹配文字(在模式中)。 一系列字符的示例:
[0-9a-zA-Z]perl填充逻辑上落在范围两端之间的所有字符。 0-9与0123456789相同,az均为小写字母字符,AZ均为大写字母字符。
规则的两个例外前面我说过,必须对字符集-] \ ^ $进行转义,以便在字符类中将它们匹配。 好吧,熟悉Perl的人都太清楚了,规则通常会有例外。 在这种情况下,例外是-^。 如果^仅是字符类中的唯一字符,则必须将其转义:
/ [\ ^] /如果在字符类内的任何其他位置使用它,则没有特殊含义,例如:
[\ d \ s ^ \ t]^在上述字符类中被视为文字^。 范围字符-也是如此。 如果您将其用作唯一字符,或用作字符类中的第一个或最后一个字符,则无需转义以匹配字面量-在模式中:
/ [abc-] // [-abc] /
/ [-] /
在以上示例中,-被视为文字。
评论字符类是perl有时会变得有些朦胧和混乱的一个示例。 当然,对于大多数编程语言而言,情况都是这样,但是perl有时会显得有些快和松散,其语法和字符根据用法和上下文具有多种含义。 我想您要么接受这种行为,要么不接受。
凯文(又名KevinADC)
资源 perldoc.perl.org:Perl的正则表达式快速启动 perldoc.perl.org:Perl的正则表达式教程 www.perl.org:由西门科泽斯开始的Perl本文受《
创用CC许可 。From: https://bytes.com/topic/perl/insights/729284-character-classes-special-characters