2014-11-23 63 views
0

简单,我想看看一个字段是否有9位数字,没有别的。perl正则表达式使用重复/量词

我是$ var = 123456789

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

从我的理解这个说, “匹配一个数字的9倍,并没有别的”

这个输出1但不是我期待的123456789。为什么?

+0

,你表现出“产出”什么声明。你期望'九美元'包含'123456789'吗?如果'$ var'设置为''abcdef9873239998782116tyra'',你想要什么? – Borodin 2014-11-23 23:13:43

回答

0

没有什么回来在列表环境正则表达式中,
所以默认是它将变量$nine设置为正则表达式函数调用的标量结果
。并且该函数调用返回标量上下文
匹配的数量。

如果你要改变,要(my $nine) = ($var =~ /\d/g);
$其中9含有9

添加捕获缓冲围绕数字。

即:

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

然而,即使你对你的赋值语法将工作,
其传统的把它写为

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

我是谁低估了你的答案的白痴。你错了。 – Borodin 2014-11-23 23:06:05

+0

谢谢。你的工作是为了我的需要。 – 2014-11-23 23:17:21

-1

你真的想这样:

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

的问题是,=~是一个比较运营商,并表达($var =~ /\d{9}/)的结果为真(1)。在我的例子中添加括号使得正则表达式捕捉到它的匹配,所以它返回你的123456789

+0

关注此问题的答案是否有误? – nmarsh 2014-11-23 22:48:06

+0

OP要求检查*“如果一个字段有9位数字而没有其他”*。您的解决方案捕获它找到的前九位数字字符,或者如果没有这样的子序列,则将“$ nine”设置为“undef”。 – Borodin 2014-11-23 22:49:43

+0

@Borodin - OP明确指出问题是作业是'1'。他可以在任何地方找到9位数字,不是吗? – sln 2014-11-23 23:01:35

1

你的格局九(国际)数字字符任何地方序列中的字符串相匹配。您所看到的1是一个true模式匹配返回的值说匹配成功。

如果你只是想验证一个变量的内容是正是 9 ASCII数字,那么你应该写

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

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

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