我需要从多行字符串中提取文本(字符和数字)。我尝试的所有内容都没有删除换行/回车。
这是有问题的字符串:
"\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中运行了这个。
感谢。
答案 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;