2009-11-25 37 views
0

我需要從多行字符串中提取文本(字符和數字)。我試過的所有東西都沒有去掉換行符/回車符。在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中運行過。

謝謝。

+0

另請參閱http://perldoc.perl.org/functions/chomp.html – Ether 2009-11-25 19:20:23

+3

您的目標不明確,因此您可以在地圖上找到答案。你想只抓住數字嗎?你是否試圖刪除換行符和回車?你想刪除所有空白嗎? – FMc 2009-11-25 19:33:59

+0

如果你說「對於這個例子中我想提取的字符串'50145395',這個問題會更清楚。在所有情況下,我想提取的數據都是一串數字。」 4件事情是一個很好的問題:清楚地說明問題,一些示例代碼,示例輸入和匹配示例輸出。確保您的樣本數據包括任何優勢的情況下(可能是一個新行被允許的數字塊之間 - 在這種情況下,'\ r \ n 50145 \ r \ n395 \ RN'將是一個很好的樣本 – daotoad 2009-11-26 03:06:34

回答

3

我不知道,你所需要的,但這裏是代碼字符串中提取的所有單詞

my @words = ($sitename =~ m/(\w+)/g); 

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

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

+1注意到,他說*字符和數字*。 – 2009-11-25 18:57:57

+0

只是爲了解釋(據我所知):匹配'm'所有連續的單詞部分'\ w +',並將它們存儲到一個數組中,可以用'join('',@ words)' – Andomar 2009-11-25 19:11:04

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' 
+0

我從獲取字符串一個XML文檔,我用十六進制表示來顯示這個字符串的十六進制字符。 – Mel 2009-11-25 18:51:33

+1

@Mel:** So?**我用字符串的十六進制表示來測試我的代碼和你聲稱使用的確切數據總之,是試圖用正則表達式解析XML的這一部分? – 2009-11-25 18:53:39

+2

+1對於好的測試用例 – Andomar 2009-11-25 19:18:57

1

最明顯的一個我沒有在帖子中看到:

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

這將刪除所有非數字。要刪除什麼,但字的字符,你可以:

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

沒有必要爲^$如果你的目的是要取代所有的非數字。此外,如果使用全局g選項,則可以一次替換一個字符;不需要與\d+匹配多個數字。

0

編輯:我的解決方案不正確;請注意思南Ünür的解決方案。

+2

將它們組合成一個單獨的字符串,但's'沒有任何作用如果你不使用'.'?嘻嘻 – Andomar 2009-11-25 18:53:17

+0

模式中沒有**'。**字符,所以這完全和完全不相關。 – 2009-11-25 18:54:40

+0

重點是,表達式應用於整個字符串,而不是一次一行。 – 2009-11-25 18:59:57

0

在過去,我已經做了類似:

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

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

您可以檢查出其他ASCII字符代碼:http://www.asciitable.com./

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"; 
0

你只想刪除換行符和回車?如果是這樣,這是你想要的東西:

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

如果你想移除所有的空格,不只是換行和換行,而不是使用:

$sitename =~ s/\s//g; 
0
$x = <<END; 
this is a multiline 
string. this is a multiline 
string. 
END 

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

提取所有數字,帶關閉非數字字符

$ sitename =「\ r \ n 50145395 \ r \ n」;

$站點名=〜S/\ d + //克;

相關問題