2017-04-03 80 views
1

我已经使用正则表达式编写了一个基本程序。 但是,整条线被返回而不是匹配的部分。仅提取模式匹配文本

我只想提取数字。

use strict; 
use warnings; 

my $line = "ABMA 1234"; 
$line =~ /(\s)(\d){4}/; 

print $line; #prints *ABMA 1234* 

我的正则表达式是否正确?

回答

2

您可以用相应的值代替精确值。而你的文字不会删除\w;

use strict; 
use warnings; 

my $line = "ABMA 1234"; 
$line=~s/([A-z]*)\s+(\d+)/$2/; 

print $line; #prints only 1234 

如果要值存储在新的字符串,然后

(my $newstring = $line)=~s/([A-z]*)\s+(\d+)/$2/; 

print $newstring; #prints only 1234 

就试试这个:

+0

字符类'[A-z]'包括'''''''','''''''''',''''以及大写和小写英文字母。你需要'[A-Za-z]'或者[[:alpha:]]或者'\ p {PosixAlpha}',这两者都需要'/ a'修饰符来防止匹配非ASCII字母。 – Borodin

+0

是的,谢谢你指出这一点。当然,我会更新。 – ssr1012

3

如果你想打印1234,你需要改变你的正则表达式并打印第二节比赛:

use strict; 
use warnings; 

my $line = "ABMA 1234"; 
$line =~ /(\s)(\d{4})/; 

print $2; 
2

我不知道你是怎么输出的比赛中perl的,但你可以使用下面的正则表达式输出在你的正则表达式中的完整匹配,你可能会在你当前的正则表达式中得到结果的空间。

\b[\d]{4} 

DEMO

+0

什么是你的正则表达式中使用字符类的? – mkHun