为什么包含精确字符串的正则表达式不成功匹配?

时间:2017-09-13 20:54:59

标签: regex perl

这可能是初学者的错误 正则表达式总是不匹配,但显然它应该。

#!/usr/bin/perl 
# This will print "Hello, World"
print "Hello, world\n";
my $addr = "Hello";
#if($addr =~ /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\)/ )
if (my $addr =~ /Hello/)
{
      print("matched\n\n");
}else
{
  print("Didnt Match\n\n");
}

3 个答案:

答案 0 :(得分:3)

my使您在本地和未初始化时匹配的变量。 所以你应该改为

if ($addr =~ /Hello/)

my表示if中的$addr是"我自己的",即与另一个$addr不同的外部范围较大的fileName.matches("[-_. A-Za-z0-9]+\\.(pdf|txt|csv)");
只有外部范围变量初始化为与正则表达式匹配的东西。第二个,内部的没有初始化,并且(至少在你的情况下)没有匹配的值。

注意:其他作者的评论提出了在将来的编程中避免/发现问题原因的最佳实践。

答案 1 :(得分:1)

我知道这已经得到了解答,但让我稍稍展开一下。

一般来说,如果我们可以称之为perl,我们会在块中工作。如果你设置

my $string = 'String';

在脚本的开头,在任何循环之外,该声明将在整个脚本中保留字符串,除非您在该行的某处重新声明或重新分配它。

my $string = 'string';
   $string = 'Text';

如果你在一个街区内工作,那会有所改变,让我们在if语句中说:

情景1。

my $var = 'test';
   if ($var =~ /test/) {
       my $string = 'string';
    }
  print $string;      # This will not work as $string only existed in the if block.

以下是相同的场景,但您在if块中重新声明$var,因此它将尝试匹配没有值的新变量,因此在此实例中$string将永远不会设定。

情景2。

my $var = 'test';
   if (my $var =~ /test/) {
       my $string = 'string';
    }

还有另一个与my的工作方式不同,即our

情景3。

my $var = 'test';
   if ($var =~ /test/) {
       our $string = 'string';
    }
print $string;

上面的场景与场景1有点不同。我们在if语句块中声明our $string,现在我们可以在该循环之外使用$ string,因为our正在说任何块来自在这里,拥有这个变量。

答案 2 :(得分:0)

U在if的范围内初始化了另一个名为$ addr的变量,而不是使用在全局范围内初始化的变量。

#!/usr/bin/perl 
# This will print "Hello, World"
print "Hello, world\n";
my $addr = "Hello";
#if($addr =~ /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\)/ )
if ($addr =~ /Hello/)
{
      print("matched\n\n");
}else
{
  print("Didnt Match\n\n");
}