【问题标题】:Perl match and extract phone number with (312) 555-1212 formatPerl 匹配并提取 (312) 555-1212 格式的电话号码
【发布时间】:2022-01-05 08:37:29
【问题描述】:

试图让 perl 识别并提取字符串中的电话号码,该字符串具有在文件中找到的一些奇怪格式:

my $str = 'Phone:

(312) 555-1212 _
';

我试过了,但这个解决方案最终会从字符串中提取所有数字:

my @all_nums = $element =~ /(\d+)/g; 
  
 if (@all_nums) {
        
    my $ph = join('-', @all_nums);
    print "PHONE NO: $ph\n"; 
        
    push(@elements_found, $ph);
            
}

非常感谢任何帮助。

【问题讨论】:

  • 也许您应该将文本文件显示为测试用例,而不是变量。
  • 请编辑问题以显示您获得的输出和您期望的输出。
  • 你想提取字符串"(312) 555-1212"还是"312""555""1212"这三个值,还是别的什么?

标签: regex perl


【解决方案1】:

为数字格式尝试更精确的正则表达式:

my @all_nums = $element =~ /\((\d+)\) (\d+)-(\d+)/g; 
  
 if (@all_nums) {
        
    my $ph = join('-', $1, $2, $3);
    print "PHONE NO: $ph\n"; 
        
    push(@elements_found, $ph);
            
}

【讨论】:

    【解决方案2】:

    下面的演示代码 sn-p 逐行读取 DATA 块,如果该行中存在电话,则提取电话,否则跳到下一行。如果在线路中找到电话号码,则将其打印在屏幕上。

    use strict;
    use warnings;
    use feature 'say';
    
    my $re = qr/(\(\d{3}\) \d{3}\-\d{4})/;
    
    while( <DATA> ) {
        next unless /$re/;
        say "-- $1 --";
    }
    
    __DATA__
    Phone:
    
    (312) 555-1212 _
    
    Call customer service at (328) 371-9302 for an assistance
    

    输出

    -- (312) 555-1212 --
    -- (328) 371-9302 --
    

    以下代码示例将 DATA 块读取到变量 $data 中,然后在 正则表达式 的帮助下将所有电话号码提取到数组 @phones 中,然后将它们打印在屏幕。

    use strict;
    use warnings;
    use feature 'say';
    
    my $re = qr/(\(\d{3}\) \d{3}\-\d{4})/;
    
    my $data = do { local $/; <DATA>; };
    my @phones = $data =~ /$re/g;
    
    say for @phones;
    
    __DATA__
    Phone:
    
    (312) 555-1212 _
    
    Call customer service at (328) 371-9302 for an assistance
    

    输出

    (312) 555-1212
    (328) 371-9302
    

    注意:验证电话号码的任务比这些代码示例中演示的要复杂

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-30
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      • 2011-09-22
      • 2013-11-17
      • 1970-01-01
      相关资源
      最近更新 更多