2016-12-09 15 views
5

Tôi có một tệp văn bản chứa danh sách các tiêu đề mà tôi cần phải thay đổi thành tiêu đề (các từ nên bắt đầu bằng một chữ cái viết hoa ngoại trừ hầu hết các bài viết, liên từ và giới từ).Làm cách nào để chuyển đổi văn bản thành trường hợp tiêu đề?

Ví dụ, danh sách các đầu sách:

barbarians at the gate 
hot, flat, and crowded 
A DAY LATE AND A DOLLAR SHORT 
THE HITCHHIKER'S GUIDE TO THE GALAXY 

nên được thay đổi:

Barbarians at the Gate 
Hot, Flat, and Crowded 
A Day Late and a Dollar Short 
The Hitchhiker's Guide to the Galaxy 

tôi đã viết đoạn mã sau:

while(<DATA>) 
{ 
    $_=~s/(\s+)([a-z])/$1.uc($2)/eg; 
    print $_; 
} 

Nhưng nó viết hoa đầu tiên thư của mỗi từ, ngay cả những từ như "at", "the" và "a" ở giữa tiêu đề:

Barbarians At The Gate 
Hot, Flat, And Crowded 
A Day Late And A Dollar Short 
The Hitchhiker's Guide To The Galaxy 

Tôi làm cách nào để thực hiện việc này?

+2

Xem thêm [Lingua :: EN :: Titlecase] (https://metacpan.org/pod/Lingua::EN::Titlecase) –

+1

@ HåkonHægland: Tuyệt vời chung tôi đa hiểu. – ssr1012

Trả lời

5

Nhờ See also Lingua::EN::Titlecase - Håkon Hægland được cung cấp cách để có được kết quả đầu ra.

use Lingua::EN::Titlecase; 
my $tc = Lingua::EN::Titlecase->new(); 

while(<DATA>) 
{ 
    my $line = $_; 
    my $tc = Lingua::EN::Titlecase->new($line); 
    print $tc; 
} 
1

Bạn cũng có thể thử sử dụng regex này: ^(.)(.*?)\b|\b(at|to|that|and|this|the|a|is|was)\b|\b(\w)([\w']*?(?:[^\w'-]|$)) và thay thế bằng \U$1\L$2\U$3\L$4. Nó hoạt động phù hợp với chữ cái đầu tiên của các từ không phải là bài viết, viết hoa nó, sau đó khớp với phần còn lại của từ đó. Điều này dường như làm việc trong PHP, tôi không biết về Perl nhưng nó sẽ có khả năng làm việc.

  • ^(.)(.*?)\b khớp với chữ cái đầu tiên của từ đầu tiên (nhóm 1) và phần còn lại của từ (nhóm 2). Điều này được thực hiện để ngăn không viết hoa từ đầu tiên vì đó là một bài viết.
  • \b(word|multiple words|...)\b khớp với bất kỳ từ kết nối nào để ngăn cách viết hoa chúng.
  • (\w)([\w']*?(?:[^\w'-]|$)) khớp với chữ cái đầu tiên của từ (nhóm 3) và phần còn lại của từ (nhóm 4). Ở đây tôi đã sử dụng [^\w'-] thay vì \b vì vậy dấu gạch ngang và dấu nháy đơn được tính là ký tự từ quá. Đây ngăn chặn 's trở thành 'S

Các \U thay thế tận các ký tự sau và \L hạ chúng. Nếu bạn muốn, bạn có thể thêm các bài viết hoặc từ khác vào regex để tránh viết hoa chúng.

CẬP NHẬT: Tôi đã thay đổi regex để bạn cũng có thể bao gồm các cụm từ kết nối (nhiều từ). Nhưng điều đó sẽ vẫn tạo ra một regex rất dài ...

+0

Các từ kết nối được sử dụng ít hơn. Thật không may, chúng tôi có nhiều hơn nữa. – ssr1012

+0

Bạn có thể thêm nhiều hơn nữa trong phần chú thích phủ định '(?! Word1 | word2 | word3 | ...)' –

+0

[Vui lòng kiểm tra điều này] (http://www.smart-words.org/linking-words/transition-words .html) – ssr1012

Các vấn đề liên quan