在Perl中,如何从包含回车符和换行符的字符串中捕获一串数字?

时间:2009-11-25 18:40:46

标签: regex perl

我需要从多行字符串中提取文本(字符和数字)。我尝试的所有内容都没有删除换行/回车。

这是有问题的字符串:

"\r\n        50145395\r\n    "

在HEX中:0D 0A 20 20 20 20 20 20 20 20 35 30 31 34 35 33 39 35 0D 0A 20 20 20 20

我尝试了以下内容:

$sitename =~ m/(\d+)/g;  
$sitename = $1;  

$sitename =~ s/^\D+//g;  
$sitename =~ s/\D+$//g;  

$sitename =~ s/^\s+//g;  
$sitename =~ s/\s+$//g;  

在所有情况下,我都无法摆脱任何不需要的角色。我在cygwin perl和Strawberry perl中运行了这个。

感谢。

8 个答案:

答案 0 :(得分:5)

在列表上下文中捕获匹配会返回捕获的字符串:

#!/usr/bin/perl

use strict; use warnings;

my $s = join('', map chr(hex), qw(
    0D 0A 20 20 20 20 20 20 20 20 35 30 
    31 34 35 33 39 35 0D 0A 20 20 20 20
));

my ($x) = $s =~ /([A-Za-z0-9]+)/;

print "'$x'\n";

输出:

C:\Temp> uio
'50145395'

答案 1 :(得分:3)

我不确定您是否需要,但这里是代码提取字符串

中的所有单词
my @words = ( $sitename =~ m/(\w+)/g );

也可以使用split完成。但是你现在需要使用空格:

my @words = split( m/\s+/, $sitename );

答案 2 :(得分:1)

我在你的帖子中没有看到的显而易见的一个:

$sitename =~ s/\D//g;

这将删除所有非数字。要删除除字词之外的任何内容,您可以:

$sitename =~ s/\W//g;

如果您打算更换每个非数字,则无需^$。此外,如果使用全局g选项,则可以一次替换一个字符;无需使用\d+匹配多个数字。

答案 3 :(得分:0)

修改:我的解决方案不正确;请注意SinanÜnür的解决方案。

答案 4 :(得分:0)

过去我做过类似的事情:

my $newline = chr(13) . chr(10);

$data =~ s/$newline/ /g;

您可以在http://www.asciitable.com./

查看其他ascii字符代码
use strict;

my $newline = chr(13);
my $newline2 = chr(10);

my $words = "\r\n        50145395\r\n    ";

foreach my $char (split //, $words) {
 my $val=ord($char);    
 print "->$char<- ($val)\n";
}

print "$words\n";

$words =~ s/$newline//g;
$words =~ s/$newline2//g;
$words =~ s/[ ]+//g;

foreach my $char (split //, $words) {
 my $val=ord($char);    
 print "->$char<- ($val)\n";
}

print "$words\n";

答案 5 :(得分:0)

您是否只想删除换行符和回车符?如果是这样,这就是你想要的:

$sitename =~ s/[\r\n]//g;

如果要删除所有空格,而不仅仅是换行符和换行符,请改用:

$sitename =~ s/\s//g;

答案 6 :(得分:0)

$x = <<END;
this is a multiline 
string. this is a multiline
string.
END

$x =~ s/\r?\n?//g;
print $x;

答案 7 :(得分:0)

要提取所有数字,请删除非数字字符

  

$ sitename =&#34; \ r \ n 50145395 \ r \ n&#34;;

     

$ sitename = ~s / \ D + // g;