Perl: hàm để cắt bỏ khoảng trắng ở đầu và cuối chuỗi


82

Có một chức năng tích hợp để cắt bỏ khoảng trắng đầu và cuối như vậy trim(" hello world ") eq "hello world"không?


3
FYI: đẳng thức chuỗi trong Perl được kiểm tra bởi toán tử eq.
A. Rex

5
Làm rõ một chút về tất cả các bước tiến mà bạn có: s/^\s+|\s+$//g;so với s/^\s*//; s/\s*$//;Cách thứ hai là cách thành ngữ hơn (chưa bao giờ hết) để làm điều này, vì khởi động lại công cụ regex thực sự nhanh hơn so với cách thay thế, trong trường hợp này. Bạn có thể đọc thêm về điều này trên Jeffrey Friedl's Mastering Regular Expressions. (Trừ khi đây đã được cố định trong một số phiên bản mới hơn của Perl, trong đó trường hợp ai đó xin vui lòng cho tôi đúng!)
Hugmeir

4
Đến từ nền tảng Java và .NET, tôi gần như bị sốc vì điều này không được tích hợp sẵn trong ngôn ngữ này! CẢM ƠN TẤT CẢ!
Landon Kuhn

3
@ landon9720, nó phần nào là: Scalar :: Util đã cắt, và là cốt lõi từ 5.7.3 - Đó là năm 2002!
Hugmeir

3
Hugmeir, điều này là sai, hãy xem câu trả lời của Ether .
daxim

Câu trả lời:


89

Đây là một cách tiếp cận sử dụng biểu thức chính quy:

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

Perl 6 sẽ bao gồm một chức năng cắt:

$string .= trim;

Nguồn: Wikipedia


5
Tôi tra cứu điều này khoảng một tháng một lần. Thật tệ là tôi không thể ủng hộ nó mỗi lần.
kyle

82

Điều này có sẵn trong String :: Util với trimphương thức:

Lưu ý của người biên tập: String::Utilkhông phải là một mô-đun cốt lõi, nhưng bạn có thể cài đặt nó từ CPAN với [sudo] cpan String::Util.

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

bản in:

chuỗi bây giờ là 'xin chào'

Tuy nhiên, bạn có thể dễ dàng thực hiện:

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

@ mklement0 và sẽ không bao giờ có. Nhưng điều này không liên quan, vì mọi người nên sử dụng các mô-đun từ CPAN.
Ether

2
tại sao mọi người nên sử dụng mô-đun từ CPAN? Nó gây khó khăn cho tính nhất quán khi sử dụng perl từ bản phân phối linux của bạn (debian, redhat, ubuntu) kết hợp với các mô-đun CPAN được cài đặt thủ công. Nó là tốt hơn nếu có điều gì có thể được thực hiện trong perl sử dụng module trong đó có sẵn như các gói phân phối Linux
Marki555

@ Các mô-đun Marki555 có sẵn dưới dạng các gói trong bản phân phối linux của bạn từ CPAN - chúng vừa được đóng gói lại. Nói chung, bạn có thể yêu cầu đóng gói một mô-đun nào đó nếu nó chưa được thực hiện (các trình debian đặc biệt đáp ứng và hữu ích).
Ether

1
Tôi biết họ cũng đến từ CPAN ... Vâng, nói chung tôi có thể yêu cầu pkg mới cho debian, nhưng nó sẽ không giúp tôi cho bản phát hành ổn định debian đã cài đặt của tôi ... đó là lý do tại sao tôi thích gói mô-đun hơn, nhưng sử dụng trực tiếp CPAN nếu thực sự cần thiết.
Marki555

4
@Ether Với tất cả sự tôn trọng, tôi thực sự đánh giá cao khi biết rằng đây là một mô-đun không phải cốt lõi. Bài đăng này nói về việc sử dụng một mô-đun thay cho một lớp lót regex khá đơn giản. Nếu mô-đun là cốt lõi, tôi sẽ cởi mở hơn với nó. Nó có liên quan trong trường hợp này.
UncleCarl

26

Không có trimchức năng tích hợp sẵn, nhưng bạn có thể dễ dàng triển khai chức năng của riêng mình bằng cách thay thế đơn giản:

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

hoặc sử dụng thay thế không phá hủy trong Perl 5.14 trở lên:

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



3

Đối với những người đang sử dụng Văn bản :: CSV, tôi đã tìm thấy chuỗi này và sau đó nhận thấy trong mô-đun CSV rằng bạn có thể loại bỏ nó thông qua chuyển đổi:

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

Logic ngược lại ở chỗ nếu bạn muốn loại bỏ thì bạn đặt thành 1. Đi hình. Hy vọng điều này sẽ giúp bất cứ ai.




2

Tôi cũng sử dụng một lookahead tích cực để cắt bớt các khoảng trống lặp lại bên trong văn bản:

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

-4

Không, nhưng bạn có thể sử dụng s///toán tử thay thế và \sxác nhận khoảng trắng để nhận được cùng một kết quả.


Điều đó sẽ loại bỏ khoảng cách giữa các từ, không chỉ ở hai đầu của chuỗi.
DarenW

@DarenW: tùy thuộc vào cách bạn sử dụng nó.
Philip Potter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.