2013-06-04 28 views
7

Tôi đang dịch mã từ perl và tôi đã đi qua dòng sauÝ nghĩa của một chút Biểu thức chính quy của perl?

$text =~ s/([?!\.][\ ]*[\'\"\)\]\p{IsPf}]+) +([\'\"\(\[\¿\¡\p{IsPi}]*[\ ]*[\p{IsUpper}])/$1\n$2/g; 

Câu hỏi của tôi là, những gì hiện \ p {ISPF} và \ p {} IsPi trận đấu tới? Tôi đã thử tìm kiếm trực tuyến nhưng chưa tìm thấy gì ...

+1

Ngoài ra: Có rất nhiều dấu gạch chéo ngược không cần thiết trong regex đó và hai lần chụp không cần thiết. 's/[?!.] [] * ['") \] \ p {IsPf}] + \ K + (? = [' "([¿¡\ p {IsPi}] * [] * [\ p {IsUpper}])/\ n/g' nên tương đương với mục đích thực tế – amon

Trả lời

11

\p{..} trận ký tự theo các thuộc tính nhân vật unicode của họ: http://perldoc.perl.org/perlunicode.html#Unicode-Character-Properties

Đặc biệt, \p{IsPf} trận đấu vật với "final punctuation" bất động sản, và \p{IsPi} trận charactes với "initial punctuation" bất động sản. Đây dường như chủ yếu là đóng và mở dấu ngoặc kép.

Điểm thay thế có vẻ là chia các câu thành các dòng riêng biệt bằng cách khớp với phần cuối và bắt đầu của một câu, có tính đến một câu có thể bắt đầu và kết thúc với nhiều loại dấu câu khác nhau.

+0

Rất cám ơn Cả hai câu trả lời của bạn và Tim đều hoàn hảo ... không may tôi phải chọn một và không phải cả hai. –

3

Như một chút thông tin bổ sung, unichars từ Unicode::Tussle có thể được sử dụng để liệt kê các ký tự phù hợp.

$ unichars -au '\p{IsPi}' | cat 
« U+000AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK 
‘ U+02018 LEFT SINGLE QUOTATION MARK 
‛ U+0201B SINGLE HIGH-REVERSED-9 QUOTATION MARK 
“ U+0201C LEFT DOUBLE QUOTATION MARK 
‟ U+0201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK 
‹ U+02039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK 
⸂ U+02E02 LEFT SUBSTITUTION BRACKET 
⸄ U+02E04 LEFT DOTTED SUBSTITUTION BRACKET 
⸉ U+02E09 LEFT TRANSPOSITION BRACKET 
⸌ U+02E0C LEFT RAISED OMISSION BRACKET 
⸜ U+02E1C LEFT LOW PARAPHRASE BRACKET 
⸠ U+02E20 LEFT VERTICAL BAR WITH QUILL 

$ unichars -au '\p{IsPf}' | cat 
» U+000BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK 
’ U+02019 RIGHT SINGLE QUOTATION MARK 
” U+0201D RIGHT DOUBLE QUOTATION MARK 
› U+0203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK 
⸃ U+02E03 RIGHT SUBSTITUTION BRACKET 
⸅ U+02E05 RIGHT DOTTED SUBSTITUTION BRACKET 
⸊ U+02E0A RIGHT TRANSPOSITION BRACKET 
⸍ U+02E0D RIGHT RAISED OMISSION BRACKET 
⸝ U+02E1D RIGHT LOW PARAPHRASE BRACKET 
⸡ U+02E21 RIGHT VERTICAL BAR WITH QUILL 
Các vấn đề liên quan