perl正则表达式使用重复/量词

时间:2014-11-23 22:23:56

标签: regex perl

很简单,我试图看一个字段是否有9位数而没有别的。

我的$ var = 123456789

( my $nine ) = ( $var =~ /\d{9}/ );

从我的理解中说,“匹配一个数字9次,没有别的”

这会输出1,但不会输出我期待的123456789。为什么呢?

3 个答案:

答案 0 :(得分:1)

您的模式匹配字符串中任意位置的九个(国际)数字字符的序列。您看到的1 true 值,模式匹配返回以表示匹配成功。

如果您只想验证变量的内容正好九个ASCII数字,那么您应该写

if ( $var =~ /\A[0-9]{9}\z/ ) { ... }

或者,如果您有ASCII /a修饰符可用(自14以来任何版本的Perl 5),那么您可以说

if ( $var =~ /\A\d{9}\z/a ) { ... }

答案 1 :(得分:0)

正则表达式中的列表上下文中没有任何内容返回,
所以默认是它将变量$nine设置为标量结果
正则表达式函数调用。并且该函数调用在标量上下文中返回 比赛的数量。

如果您要将其更改为(my $nine) = ($var =~ /\d/g);
$ 9将包含9.

在数字周围添加捕获缓冲区。

即:

( my $nine ) = ( $var =~ /(\d{9})/ );

但是,即使您的作业语法有效, 它的常规写作是

my ($nine) = $var =~ /(\d{9})/;

答案 2 :(得分:-1)

你真的想要这个:

( my $nine ) = ( $var =~ /(\d{9})/ );

问题是=~是比较运算符,表达式( $var =~ /\d{9}/ )的结果为真(1)。在我的示例中添加括号使正则表达式捕获其匹配项,因此它返回123456789。