Perl : 문자열 선행 및 후행 공백을 제거하는 기능


82

다음과 같이 선행 및 후행 공백을 트리밍하는 내장 함수가 trim(" hello world ") eq "hello world"있습니까?


3
참고 : Perl의 문자열 동등성은 연산자에 의해 테스트됩니다 eq.
A. Rex 2011 년

5
당신이 얻은 모든 asnwers에 대한 약간의 설명 : s/^\s+|\s+$//g;vs s/^\s*//; s/\s*$//;후자는 정규식 엔진을 다시 시작하는 것이 실제로 교대보다 빠르기 때문에 (조금씩) 더 관용적 인 방법입니다. 이에 대한 자세한 내용은 Jeffrey Friedl의 Mastering Regular Expressions에서 확인할 수 있습니다. (이것이 Perl의 최신 버전에서 수정되지 않는 한, 누군가가 저를
고쳐

4
Java 및 .NET 배경에서 왔기 때문에 이것이 언어에 내장되어 있지 않다는 사실에 거의 충격을 받았습니다! 모두 감사합니다!
Landon Kuhn 2011 년

3
@ landon9720, 다소 다음과 같습니다. Scalar :: Util에는 트림이 있으며 5.7.3 이후 핵심입니다.-2002 년입니다!
Hugmeir 2011 년

3
Hugmeir, 이것은 잘못되었습니다 . Ether의 답변을 참조하십시오 .
daxim

답변:


89

다음은 정규 표현식을 사용하는 한 가지 방법입니다.

$string =~ s/^\s+|\s+$//g ;     # remove both leading and trailing whitespace

Perl 6에는 트림 기능이 포함됩니다.

$string .= trim;

출처 : Wikipedia


5
한 달에 한 번 정도 조회합니다. 안타깝지만 매번 찬성 할 수 없습니다.
kyle

82

String :: Util 에서 다음 trim메소드를 사용할 수 있습니다 .

편집자 주 : String::Util핵심 모듈 아니지만, 당신은에서 설치할 수 있습니다 CPAN[sudo] cpan String::Util.

use String::Util 'trim';
my $str = "  hello  ";
$str = trim($str);
print "string is now: '$str'\n";

인쇄물:

문자열은 이제 'hello'입니다.

그러나 스스로하는 것은 쉽습니다.

$str =~ s/^\s+//;
$str =~ s/\s+$//;

@ mklement0도 마찬가지입니다. 그러나 모든 사람이 CPAN의 모듈을 사용해야하기 때문에 이것은 관련이 없습니다.
Ether

2
왜 모두가 CPAN의 모듈을 사용해야합니까? 수동으로 설치된 CPAN 모듈과 결합 된 Linux 배포 (debian, redhat, ubuntu)에서 perl을 사용할 때 일관성이 어렵습니다. Linux 배포판에서 패키지로 제공되는 모듈을 사용하여 perl에서 무언가를 수행 할 수 있다면 훨씬 더 좋습니다
Marki555

Marki555 당신의 리눅스 배포판의 패키지로 사용할 모듈 @ 있습니다 CPAN에서 - 그들은 단지 재 포장했습니다. 일반적으로 아직 패키지화되지 않은 경우 특정 모듈을 패키지화하도록 요청할 수 있습니다 (데비안 사람들은 특히 반응적이고 도움이됩니다).
Ether

1
나는 그것들도 CPAN에서 왔다는 것을 알고 있습니다 ... 예, 일반적으로 데비안 용 새 pkg를 요청할 수 있지만 설치된 데비안 안정 릴리스에는 도움이되지 않습니다. 정말 필요했습니다.
Marki555

4
@Ether 모든 존경심으로, 이것이 비 핵심 모듈이라는 것을 알고 정말 감사합니다. 이 게시물은 상당히 간단한 정규식 한 줄 대신 모듈을 사용하는 방법에 대해 설명합니다. 모듈이 핵심이라면 더 개방적 일 것입니다. 이 경우 관련이 있습니다.
UncleCarl

26

내장 trim함수는 없지만 간단한 대체를 사용하여 쉽게 구현할 수 있습니다.

sub trim {
    (my $s = $_[0]) =~ s/^\s+|\s+$//g;
    return $s;
}

또는 Perl 5.14 이상에서 비파괴 대체 사용 :

sub trim {
   return $_[0] =~ s/^\s+|\s+$//rg;
}



3

Text :: CSV를 사용하는 사람들을 위해이 스레드를 찾은 다음 CSV 모듈 내에서 스위치를 통해 제거 할 수 있음을 알았습니다.

$csv = Text::CSV->new({allow_whitespace => 1});

논리는 당신이 스트립을 원한다면 1로 설정한다는 점에서 거꾸로됩니다. 이것이 누구에게나 도움이되기를 바랍니다.



2

적용 : s/^\s*//; s/\s+$//;그것에. 또는 s/^\s+|\s+$//g당신이 화려하고 싶다면 사용 하십시오.


2

또한 긍정적 인 미리보기를 사용하여 텍스트 내부의 반복되는 공백을 트리밍합니다.

s/^\s+|\s(?=\s)|\s+$//g

-4

아니요,하지만 s///대체 연산자와 \s공백 어설 션을 사용하여 동일한 결과를 얻을 수 있습니다.


그러면 문자열의 양쪽 끝이 아니라 단어 사이의 공백이 제거됩니다.
DarenW

@DarenW : 사용 방법에 따라 다릅니다.
Philip Potter
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.