正则表达式
除了Perl以外,正则表达式也被应用在许多其他的语言和工具中。Perl的核心正则表达式语法基本上和其他地方别无二致,不过Perl完整的正则表达式功能复杂到令人发指,并且难以理解。我能给的最好的建议就是尽可能避免引入不必要的复杂性。
用=~ m//
运算符进行正则表达式匹配。在scalar上下文中,=~ m//
在成功时返回true,而失败是返回false。
my $string = "Hello world";
if($string =~ m/(\w+)\s+(\w+)/) {
print "success";
}
圆括号表示匹配组,匹配成功以后,匹配组被填入内置变量$1
、$2
、$3
……:
print $1; # "Hello"
print $2; # "world"
在列表上下文中,=~ m//
返回$1
、$2
……组成的列表。
my $string = "colourless green ideas sleep furiously";
my @matches = $string =~ m/(\w+)\s+((\w+)\s+(\w+))\s+(\w+)\s+(\w+)/;
print join ", ", map { "'".$_."'" } @matches;
# prints "'colourless', 'green ideas', 'green', 'ideas', 'sleep', 'furiously'"
用=~ s///
运算符进行正则表达式替换。
my $string = "Good morning world";
$string =~ s/world/Vietnam/;
print $string; # "Good morning Vietnam"
请注意$string
的内容发生了怎样的改变。你必须在=~ s///
运算符左边提供一个scalar变量,如果你提供了字面字符串,会返回一个错误。
/g
标志表示“全局匹配”(译者注:原文“group match”,应为“global match”更为确切)。
在scalar上下文中,每次=~ m//g
调用都会返回下一个匹配项,成功是返回true,而失败时返回false。然后你还是可以通过$1
等等来得到匹配的组。例如:
my $string = "a tonne of feathers or a tonne of bricks";
while($string =~ m/(\w+)/g) {
print "'".$1."'\n";
}
在列表上下文中,=~ m//g
一次性返回所有匹配的结果。
my @matches = $string =~ m/(\w+)/g;
print join ", ", map { "'".$_."'" } @matches;
每次=~ s///g
调用会进行一次全局的查找/替换,并且返回匹配的次数。在这里,我们把所有元音字母用字母“r”替代。
# 先不用/g进行一次替换
$string =~ s/[aeiou]/r/;
print $string; # "r tonne of feathers or a tonne of bricks"
# 再替换一次
$string =~ s/[aeiou]/r/;
print $string; # "r trnne of feathers or a tonne of bricks"
# 用/g全部替换
$string =~ s/[aeiou]/r/g;
print $string, "\n"; # "r trnnr rf frrthrrs rr r trnnr rf brrcks"
/i
标志表示查找替换对于大小写不敏感。
/x
标志允许正则表达式中包含空白符(例如换行符)和注释。
"Hello world" =~ m/
(\w+) # one or more word characters
[ ] # single literal space, stored inside a character class
world # literal "world"
/x;
# returns true
当前内容版权归 胡瀚森(Sam Hu)译 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 胡瀚森(Sam Hu)译 .