Perl 匹配并提取 (312) 555-1212 格式的电话号码

Posted

技术标签:

【中文标题】Perl 匹配并提取 (312) 555-1212 格式的电话号码【英文标题】:Perl match and extract phone number with (312) 555-1212 format 【发布时间】: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"这三个值,还是别的什么? 【参考方案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/(\(\d3\) \d3\-\d4)/;

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/(\(\d3\) \d3\-\d4)/;

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

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

【讨论】:

以上是关于Perl 匹配并提取 (312) 555-1212 格式的电话号码的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Perl 中的匹配大括号之间提取字符串?

使用 Perl 提取特定行

如何从 Perl 中的一行中提取非空白组?

Perl 匹配括号内的内容

Perl:如何将字符串的最后 n 位与 n 位或更多位连续匹配?

Perl 正则表达式匹配分隔字符串