我在理解 regex
的基本规则时遇到了很多麻烦,希望有人能用“简单的英语”帮助解释它们。
$_ = '1: A silly sentence (495,a) *BUT* one which will be useful. (3)';
print "Enter a regular expression: ";
my $pattern = <STDIN>;
chomp($pattern);
if (/$pattern/) {
print "The text matches the pattern '$pattern'.\n";
print "\$1 is '$1'\n" if defined $1;
print "\$2 is '$2'\n" if defined $2;
print "\$3 is '$3'\n" if defined $3;
print "\$4 is '$4'\n" if defined $4;
print "\$5 is '$5'\n" if defined $5;
}
三个测试输出
Enter a regular expression: ([a-z]+)
The text matches the pattern '([a-z]+)'
$1 is 'silly'
Enter a regular expression: (\w+)
The text matches the pattern '(\w+)'
$1 is '1'
Enter a regular expression: ([a-z]+)(.*)([a-z]+)
The text matches the pattern '([a-z]+)(.*)([a-z]+)'
$1 is 'silly'
$2 is " sentence (495,a) *BUT* one which will be usefu'
$3 is 'l'
我的困惑如下
([a-z]+)
不是“小写字母和一个/多个重复”的意思吗?如果是这样,不应该也选择“will”吗?除非它与 () 有关内存有关(即“silly”是 5 个字母的单词,所以“will”不会被拾起,但“willx”会 ??)(\w+)
不是“任何单词和一个/多个重复”的意思吗?如果是这样,为什么数字“1”被选中,因为没有重复但后面有一个冒号“:”?([a-z]+)(.*)([a-z]+)
的意思是“任何小写和重复”,紧接着是“任何东西和 0 个或更多重复” ,紧接着是“任何小写并重复”?如果是这样,为什么输出看起来像上面显示的那样?
我尝试尽可能多地在网上查找,但仍然无法理解它们。任何帮助将不胜感激。谢谢。
最佳答案
不是,它的意思是“一个或多个无重音的小写拉丁字母”。
是的,
“will”
也会匹配,但是除非您使用/g
,否则匹配操作只会返回第一个匹配项。print "$1\n" while /([a-z]+)/g; # //g in scalar context or print "$_\n" for /([a-z]+)/g; # //g in list context
参见 perlop 中的
m/PATTERN/
有关如何使用/g
的详细信息。不是,它的意思是“一个或多个单词字符”,所以它确实可以匹配单个字符。
或者您可能对
1
是一个字符字符感到惊讶?在 ASCII 范围内,单词字符为A-Z
、a-z
、0-9
和_
。在 ASCII 范围之外发现了另外 102,661 个单词字符。意思是“一个或多个不带重音的小写拉丁字母,后跟除换行符以外的任意数量的字符,再后跟一个或多个不带重音的小写拉丁字母”。
如果您问为什么
.*
匹配得如此之多,引擎将始终在当前位置尽可能多地匹配。这称为贪婪。也许您正在寻找
/([a-z]+)([^a-z]+)([a-z]+)/
。
关于regex - 对 Perl 中正则表达式基本规则的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15604982/