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 格式的电话号码的主要内容,如果未能解决你的问题,请参考以下文章