2009-01-09 32 views

Trả lời

30

Trong Perl, bạn có thể làm:

$string =~ s/(some_regex)/lc($1)/ge; 

Tùy chọn /e gây các biểu hiện thay thế để được hiểu như mã Perl để được đánh giá, có giá trị trả về được sử dụng như giá trị thay thế cuối cùng. lc($x) trả về phiên bản thấp hơn của $x. (Không chắc chắn nhưng tôi giả định lc() sẽ xử lý các ký tự quốc tế chính xác trong các phiên bản Perl gần đây.)

/g có nghĩa là khớp trên toàn cầu. Bỏ qua số g nếu bạn chỉ muốn thay thế một lần.

3

Trong Perl, có

$string =~ tr/[A-Z]/[a-z]/; 
+1

tất nhiên không hoạt động đối với các ký tự quốc tế .. –

+0

[A-Z]? Đó là một ví dụ. Điều đó nói rằng, tôi đã bình chọn cho câu trả lời của j_random_hacker. –

2

Hầu hết Regex triển khai cho phép bạn vượt qua một chức năng gọi lại khi thực hiện một thay thế, vì vậy bạn chỉ có thể trả về một phiên bản chữ thường của trận đấu từ callback.

+2

s/most/some/gi? – Rhubbarb

52

Nếu phiên bản regex của bạn hỗ trợ nó, bạn có thể sử dụng \ L, như vậy trong một vỏ POSIX:

sed -r 's/(^.*)/\L\1/' 
+2

+1 cho giải pháp không phải Perl. Hoạt động trong Kate: "\ L \ 1" –

+3

Điều này dường như hoạt động với số lượng bộ dụng cụ regex đáng ngạc nhiên, ngay cả khi bạn không ở trong môi trường giống như vỏ. – Tim

+2

@Tim: Đồng ý, ngay cả Notepad ++ cũng hỗ trợ nó. –

12

Nếu bạn đang sử dụng một trình soạn thảo như SublimeText hoặc TextMate , có một cơ hội tốt bạn có thể sử dụng

\L$1 

làm địa chỉ thay thế của bạn, nơi $1 dùng để chỉ thứ gì đó từ biểu thức chính quy mà bạn đặt dấu ngoặc đơn. Ví dụ , đây là điều tôi đã sử dụng để viết hoa tên trường trong một số SQL, nhận mọi thứ ở bên phải của 'dưới dạng' ở cuối dòng bất kỳ. Đầu tiên là "tìm thấy" biểu thức chính quy:

(as|AS) ([A-Za-z_]+)\s*,$ 

và sau đó là biểu hiện thay thế:

$1 '\L$2', 

Nếu bạn sử dụng Vim (hoặc có lẽ gvim), sau đó bạn sẽ muốn sử dụng \L\1 thay vì \L$1, nhưng có một nếp nhăn mà bạn sẽ cần phải nhận thức được: Vim đảo ngược cú pháp giữa các ký tự dấu ngoặc đơn và ký tự dấu ngoặc đơn thoát. Vì vậy, để chỉ định một phần của cụm từ thông dụng được đưa vào thay thế ("đã chụp"), bạn sẽ sử dụng \( ở đầu và \) ở cuối. Hãy suy nghĩ của \ là — thay vì thoát một ký tự đặc biệt để biến nó thành chữ cái — đánh dấu sự bắt đầu của một ký tự đặc biệt (như với \s, \w, \b và vv). Vì vậy, nó có vẻ kỳ lạ nếu bạn không quen với nó, nhưng nó thực sự là hoàn toàn hợp lý nếu bạn nghĩ về nó theo cách Vim.


Tôi đã thử nghiệm điều này trong cả hai TextMate và SublimeText và nó hoạt động như nó vốn có, nhưng một số biên tập viên sử dụng \1 thay vì $1. Hãy thử cả hai và xem trình soạn thảo của bạn sử dụng.

Tôi vừa lấy regex này ra khỏi lịch sử của mình. Tôi luôn luôn chỉnh regexen trong khi sử dụng chúng, và tôi không thể hứa với phiên bản cuối cùng, vì vậy tôi không cho rằng nó phù hợp với mục đích được mô tả, và đặc biệt là với SQL được định dạng khác với SQL tôi đang làm, một ví dụ cụ thể về giảm tải trong biểu thức chính quy. YMMV. UAYOR.

+0

Tốt, Intellij IDEA cũng hỗ trợ điều này –

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