2009-11-25 3 views
0

여러 줄 문자열에서 텍스트 (문자 및 숫자)를 추출해야합니다. 내가 시도한 모든 것은 라인 피드/캐리지 리턴을 제거하지 않습니다.Perl에서 캐리지 리턴 및 줄 바꿈이 포함 된 문자열에서 숫자 문자열을 캡처하려면 어떻게해야합니까?

는 그것이 HEX에서
"\r\n  50145395\r\n " 

: 여기서

문제의 문자열 0D 0A 20 20 20 20 20 20 20 20 35 30 31 34 35 33 39 35 0 D 0A 20 20 20 20

나는 시도 다음

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

$sitename =~ s/^\D+//g; 
$sitename =~ s/\D+$//g; 
을 모든 경우에 53,691,363,210

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

내가 원치 않는 모든 문자를 제거 얻을 수 없습니다. 나는 이것을 cygwin perl과 Strawberry perl에서 실행했다.

감사합니다.

+0

또한보십시오 http://perldoc.perl.org/functions/chomp.html – Ether

+3

당신의 목표는 명확하지 않다, 그래서 당신은지도 전면에 응답을 얻고있다. 자릿수 만 잡으려고하는거야? 개행과 캐리지 리턴을 제거하려고합니까? 모든 공백을 제거하려고합니까? – FMc

+0

이 질문은 "이 예제 문자열의 경우 '50145395'를 추출하려고합니다. 모든 경우에 추출하려는 데이터는 숫자 문자열입니다." 4 가지가 좋은 질문입니다 : 문제에 대한 명확한 진술, 몇 가지 샘플 코드, 샘플 입력 및 일치하는 샘플 출력. 샘플 데이터에 엣지 케이스가 포함되어 있는지 확인하십시오 (예 : \ r \ n 50145 \ r \ n395 \ rn의 숫자 블록 사이에 줄 바꿈이 허용 될 수 있습니다) – daotoad

답변

3

나는 당신이 필요로하는 것을 잘 모르겠지만, 여기에 문자열에서 모든 단어를 추출하는 코드는

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

또한 split으로 수행 할 수 있습니다. 하지만 지금은 공간을 사용할 필요가 :

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

+1 그는 문자와 숫자 *를 말한 것을 알기 위해 –

+0

그냥 이해할 수 있습니다.) : 이것은 연속적인 단어'\ w +'의 모든 부분을'm '에 매치시켜 배열에 저장한다.'join (' ', @ words)' – Andomar

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 문서를 만들고이 문자열의 16 진수를 표현하기 위해 16 진수 표현을 사용합니다. – Mel

+1

@Mel : ** 그래서? ** 내가 사용하고 있다고 주장한 정확한 데이터로 코드를 테스트하기 위해 문자열의 16 진수 표현을 사용했습니다. 어쨌든, XML을 파싱하기 위해 정규 표현식을 사용하려는 시도의 일부입니까? –

+2

+1 좋은 테스트 케이스의 경우 – Andomar

1

분명한 하나는 내가 게시물에 보지 못했다 :

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

이 아닌 모든 숫자를 제거합니다. 단어 문자 아무것도하지만를 제거하려면, 당신 수 :

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

당신의 의도가 아닌 모든 숫자를 대체 할 경우 ^ 또는 $에 대한 필요가 없습니다. 또한 글로벌 g 옵션을 사용하면 한 번에 한 문자 씩 바꿀 수 있습니다. 하나 이상의 숫자를 \d+과 일치시킬 필요가 없습니다.

0

편집 : 내 솔루션이 올바르지 않습니다. 대신 Sinan Ünür의 솔루션에 주목하십시오.

과거
+2

으로 단일 문자열로 결합 할 수있다. 그러나's'는 효과가 없다. '.'을 쓰지 않는다면? hehe – Andomar

+0

패턴에 **'.' ** 문자가 없으므로 이것은 완전히 완전 무관합니다. –

+0

요점은 표현식이 한 번에 한 줄씩 쓰는 대신 전체 문자열에 적용된다는 것입니다. –

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

모든 숫자를 추출하려면, 스트립 off 숫자가 아닌 문자

$ sitename = "\ r \ n 50145395 \ r \ n";

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

관련 문제