2009-06-24 32 views
34

Tôi đang sử dụng Notepad ++ để thực hiện thay thế văn bản trong tệp ngôn ngữ 5453 hàng. Định dạng của các hàng của tệp là:Regex để đổi thành trường hợp câu

variable.name = Variable Value Over Here, that''s for sure, Really 

Dấu nháy đôi là cố ý.

Tôi cần phải chuyển đổi giá trị thành trường hợp câu, ngoại trừ các từ "Ở đây" và "Thực sự" phù hợp và phải được viết hoa. Như bạn có thể thấy, trường hợp trong giá trị thường được trộn lẫn để bắt đầu.

Tôi đã làm việc này một lúc. Tất cả những gì tôi có cho đến thời điểm này là:

(.)([A-Z])(.+) 

dường như ít nhất phải chọn chuỗi thích hợp. Phần thay thế là nơi tôi đang đấu tranh.

+7

Tại sao "Ở đây" và "Thực sự" phù hợp? –

Trả lời

10

Thay thế Regex không thể thực thi hàm (như viết hoa) trên các kết quả phù hợp. Bạn sẽ phải viết kịch bản đó, ví dụ: bằng PHP hoặc JavaScript.

Cập nhật: Xem Jonas' answer.

tôi đã xây dựng cho mình một trang web gọi là Text Utilities để làm điều đó loại điều:

  • dán văn bản của bạn
  • đi vào "Find, regexp & thay thế" (hoặc bấm Ctrl + phím Shift + F)
  • nhập regex của bạn (của tôi sẽ là ^(.*?\=\s*\w)(.*)$)
  • kiểm tra các "^ dòng $ trận đấu giới hạn" tùy chọn
  • chọn "Áp dụng chức năng JS để trận đấu"
  • thêm đối số (đầu tiên là trận đấu, sau đó mô hình phụ), đây s, start, rest
  • thay đổi câu lệnh return để return start + rest.toLowerCase();

chức năng cuối cùng trong vùng văn bản trông như thế này:

return function (s, start, rest) { 
    return start + rest.toLowerCase(); 
}; 

Có lẽ thêm một số mã để tận dụng một số từ như "Thật" và "Here".

+0

Cảm ơn bạn đã giúp streetpc. Trong Notepad ++ tôi có thể áp dụng hàm thay thế bằng cách sử dụng regex là suh-weet. Sau đó, một lần nữa, trang web của bạn cũng suh-weet. Điều này khá nhiều móng tay nó, trừ khi tôi có một câu mới trong phần biến, nhưng tôi có thể sửa chữa bằng cách tìm ". [A-z]" và sửa chữa các trường hợp trên lá thư đầu tiên sau một sự kết hợp không gian thời gian. Tôi sẽ để lại câu hỏi mở một chút để xem liệu mọi người dùng Notepad ++ có phản hồi hay không nhưng bạn chắc chắn đã giải quyết được vấn đề của mình. Cảm ơn! – jkramp

+0

Bạn được chào đón :) –

+0

Điều này có thể được thực hiện trong Vim. http://vim.wikia.com/wiki/Changing_case_with_regular_expressions – MaxH

6

Trong Notepad ++, bạn có thể sử dụng plugin được gọi là PythonScript để thực hiện công việc. Nếu bạn cài đặt plugin, tạo ra một kịch bản mới như vậy:

enter image description here

Sau đó, bạn có thể sử dụng đoạn mã sau, thay thế các biến regex và chức năng như bạn thấy phù hợp:

import re 

#change these 
regex = r"[a-z]+sym" 
function = str.upper 

def perLine(line, num, total): 
for match in re.finditer(regex, line): 
    if match: 
     s, e = match.start(), match.end() 
     line = line[:s] + function(line[s:e]) + line[e:] 
     editor.replaceWholeLine(num, line) 

editor.forEachLine(perLine) 

đặc biệt này ví dụ hoạt động bằng cách tìm tất cả các kết quả phù hợp trong một dòng cụ thể, sau đó áp dụng hàm cho mỗi kết quả phù hợp. Nếu bạn cần hỗ trợ nhiều dòng, Script Python "Conext-Help" giải thích tất cả các hàm được cung cấp bao gồm các hàm pymlsearch/pymlreplace được định nghĩa trong đối tượng 'editor'.

Khi bạn đã sẵn sàng chạy tập lệnh, hãy chuyển đến tệp bạn muốn chạy trước, sau đó chuyển đến "Tập lệnh>" trong menu Tập lệnh Python và chạy tệp của bạn.

Lưu ý: trong khi bạn có thể sử dụng chức năng hoàn tác của notepad ++ nếu bạn lộn xộn, có thể nên đặt văn bản vào một tệp khác trước để xác minh nó hoạt động.

P.S. Bạn có thể 'tìm' và 'đánh dấu' mọi lần xuất hiện của biểu thức chính quy bằng cách sử dụng hộp thoại tìm kiếm tích hợp của notepad ++ và nếu bạn có thể chọn tất cả, bạn có thể sử dụng chức năng "Characters-> UPPER CASE" của TextFX cho vấn đề cụ thể này, nhưng tôi ' m không chắc chắn cách chuyển từ văn bản được đánh dấu hoặc tìm thấy sang văn bản đã chọn. Nhưng, tôi nghĩ tôi sẽ đăng bài này trong trường hợp bất cứ ai làm ...

Edit: Trong Notepad ++ 6.0 hoặc cao hơn, bạn có thể sử dụng "PCRE (Perl Tương thích Regular Expression) Tìm kiếm/Thay thế" (nguồn: http://sourceforge.net/apps/mediawiki/notepad-plus/?title=Regular_Expressions) Vì vậy, điều này có thể đã được giải quyết bằng cách sử dụng một regex như (.)([A-z])(.+) với một đối số thay thế như \1\U\2\3.

+0

Đối với những người tìm kiếm một tài liệu tham khảo tốt để tìm kiếm PCRE và thay thế cú pháp (bao gồm cả chuyển đổi trường hợp, vv), bạn có thể xem trang web Perldoc này: http://perldoc.perl.org/perlre.html - - Tôi đã không thể tìm thấy bất kỳ vị trí nào khác, nơi những thứ như '\ U' đã được ghi lại! –

123
Find: (.)([A-Z])(.+) 
Replace: \1\U\2\L\3 

Trong Notepad ++ 6.0 trở lên (đi kèm với hỗ trợ PCRE được tích hợp sẵn).

+2

Oh wow, tôi đã muốn một cái gì đó như thế này quá lâu. Cảm ơn bạn!! –

+24

Tôi sẽ thêm rằng '\ u' chữ hoa chỉ là ký tự đầu tiên của trận đấu. Tương tự '\ l' sẽ chỉ chữ thường đầu tiên. –

+6

Đây phải là câu trả lời. – sonnb

3

Người hỏi có một trường hợp rất cụ thể trong đầu. Như một "thay đổi đối với trường hợp câu" chung trong notepad ++ đề xuất regexp đầu tiên không hoạt động đúng với tôi. trong khi không hoàn hảo, đây là một phiên bản tinh chỉnh mà là một cải tiến lớn về bản gốc cho các mục đích của tôi:

find: ([\.\r\n][ ]*)([A-Za-z\r])([^\.^\r^\n]+) 
replace: \1\U\2\L\3 

Bạn vẫn có một vấn đề với trường hợp danh từ thấp hơn, tên, ngày tháng, nước vv nhưng một tốt trình kiểm tra chính tả có thể trợ giúp điều đó.

+0

cảm ơn! \ U làm việc cho tôi. Tôi cần phải thay đổi một loạt các tên biến từ dấu gạch dưới sang trường hợp lạc đà, sau đó trong tuyệt vời, tôi đã tìm kiếm biểu thức (. +) _ (. +) (<- đây không phải là mắt con quái vật) và tái tạo nó với $ 1 \ U 2 đô la – Eugenio

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