Eclipse, tìm kiếm và thay thế biểu thức chính quy


119

Trong eclipse, có thể sử dụng chuỗi tìm kiếm phù hợp như một phần của chuỗi thay thế khi thực hiện tìm kiếm và thay thế biểu thức chính quy không?

Về cơ bản, tôi muốn thay thế tất cả các lần xuất hiện của

variableName.someMethod()

với:

((TypeName)variableName.someMethod())

Trong đó tên biến có thể là bất kỳ tên biến nào.

Trong sed, tôi có thể sử dụng một cái gì đó như:

s/[a-zA-Z]+\.someMethod\(\)/((TypeName)&)/g

Đó là, & đại diện cho chuỗi tìm kiếm phù hợp. Có điều gì đó tương tự trong Eclipse không?

Cảm ơn!


Tài liệu hay về Eclipse RegEx: help.eclipse.org/kepler/…
Kolob Canyon,

Câu trả lời:


225

Có, "()" chụp một nhóm. bạn có thể sử dụng lại nó với $ i, nơi tôi là nhóm chụp thứ.

Vì thế:

Tìm kiếm: (\w+\.someMethod\(\))

thay thế: ((TypeName)$1)

Gợi ý: CTRL+ Spacetrong hộp văn bản cung cấp cho bạn tất cả các loại gợi ý để viết biểu thức chính quy.


Đó là một câu trả lời hay và một gợi ý hữu ích. Nó sẽ hữu ích hơn nếu nó được mô tả chi tiết hơn.
iammilind

Bravo Eclipse, bạn đã triển khai tính năng này đúng cách!
Kenogu Labz

Tôi đặc biệt yêu thích ví dụ về "Mã hệ lục phân cho ký tự Unicode" :)
Stewart Murrie

Tôi muốn thêm một số mã thực sự giúp ích cho tôi. Tôi cần phải thay thế mọi stringVar.equals("xxx")bằng "xxx".equals(stringVar). Tôi đã sử dụng regex sau trong hộp thoại tìm / thay thế: search: ([^()! ]+).equals\("(.*)"\), replace: "$2".equals\($1\).
LaDude

Không phải cho tôi. Luôn thay thế nhóm đầu tiên ...?
RightmireM

6

Sử dụng ...
search = (^. * Import) (. *) (\ (. * \) :)
thay thế = $ 1 $ 2

... thay thế ...

from checks import checklist(_list):

...với...

from checks import checklist



Các khối trong regex được phân định bằng dấu ngoặc đơn (không đứng trước "\")

(^. * Import) tìm thấy "từ kiểm tra nhập" và tải nó vào $ 1 (nhật thực bắt đầu đếm ở 1)

(. *) Tìm tiếp theo " mọi thứ "cho đến lần gặp tiếp theo" ("và tải nó lên $ 2. $ 2 dừng lại ở dấu" ("vì phần tiếp theo (xem dòng tiếp theo bên dưới)

(\ (. * \) :) cho biết" ở lần gặp đầu tiên "( "sau khi bắt đầu khối $ 2 ... dừng khối $ 2 và bắt đầu $ 3. $ 3 được tải với" ('bất kỳ văn bản nào'): "hoặc trong ví dụ là" (_list): "

Sau đó, trong phần thay thế, chỉ cần đặt $ 1 $ 2 để thay thế tất cả ba khối chỉ bằng hai khối đầu tiên.



Ảnh chụp màn hình


3

NomeN đã trả lời chính xác, nhưng câu trả lời này sẽ không có ích cho người mới bắt đầu như tôi vì chúng tôi sẽ có một vấn đề khác cần giải quyết và chúng tôi sẽ không biết cách sử dụng RegEx trong đó. Vì vậy, tôi đang thêm một chút giải thích cho điều này. Câu trả lời là

tìm kiếm: (\ w + \. someMethod \ (\))

thay thế: ((TypeName) $ 1)

Đây:

Đang tìm:

  • Đầu tiên và cuối cùng '(' ')' mô tả một nhóm trong regex

  • '\ w' mô tả các từ (chữ và số + gạch dưới)

  • '+' mô tả một hoặc nhiều (tức là một hoặc nhiều chữ và số + gạch dưới)

  • '.' là một ký tự đặc biệt mô tả bất kỳ ký tự nào (tức là. + nghĩa là một hoặc nhiều ký tự bất kỳ). Bởi vì đây là một ký tự đặc biệt để mô tả một '.' chúng ta nên cung cấp một ký tự thoát với nó, tức là '.'

  • 'someMethod' được đưa ra như nó sẽ được tìm kiếm.

  • Hai dấu ngoặc đơn '(', ')' được đưa ra cùng với ký tự thoát vì chúng là ký tự đặc biệt được sử dụng để mô tả một nhóm (chúng ta sẽ thảo luận về nhóm ở điểm tiếp theo)

Thay thế:

  • Nó được cung cấp ' ((TypeName) $ 1) ', ở đây $ 1 mô tả nhóm. Đó là tất cả các ký tự được đặt trong dấu ngoặc đơn đầu tiên và cuối cùng '(', ')' trong trường tìm kiếm

  • Ngoài ra, hãy đảm bảo rằng bạn đã chọn tùy chọn 'Biểu thức chính quy' để tìm hộp thay thế

Thông tin thêm về RegEx có thể được tìm thấy trong http://regexr.com/ .


2

Ít nhất nhóm STS (SpringSource Tool Suite) được đánh số bắt đầu từ dạng 0, vì vậy chuỗi thay thế sẽ là

replace: ((TypeName)$0)

5
Điều đó không đúng đâu afaik. $ 0 đại diện cho toàn bộ cụm từ tìm kiếm ban đầu. Trong trường hợp này, tôi đoán điều đó sẽ xảy ra một cách tình cờ.
Walter Heck

0

Dành cho người cần giải thích và ví dụ về cách sử dụng regxp trong Eclipse. Đây là ví dụ của tôi minh họa vấn đề.

nhập mô tả hình ảnh ở đây

Tôi muốn đổi tên

/download.mp4^lecture_id=271

đến

/271.mp4

Và có thể có nhiều trong số này.

Đây là cách nó nên được thực hiện.

nhập mô tả hình ảnh ở đây

Sau đó nhấn nút tìm / thay thế

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.