Tìm kiếm biểu thức chính quy thay thế trong Văn bản cao siêu 2


440

Tôi đang tìm kiếm để thay thế tìm kiếm bằng các biểu thức thông thường trong Sublime Text 2. Tài liệu về điều này khá thiếu máu. Cụ thể, tôi muốn thay thế các nhóm, vì vậy một cái gì đó như chuyển đổi văn bản này:

Hello my name is bob

Và thuật ngữ tìm kiếm này:

Tìm cái gì: my name is (\w)+

Thay thế bằng: my name used to be $(1)

Thuật ngữ tìm kiếm hoạt động tốt nhưng tôi không thể tìm ra cách thực sự thay thế bằng cách sử dụng nhóm regrec.

Câu trả lời:


583

Thông thường, tham chiếu ngược là $1hoặc \1(dấu gạch chéo ngược) cho nhóm chụp đầu tiên (khớp đầu tiên của mẫu trong ngoặc đơn) và thực sự Sublime hỗ trợ cả hai cú pháp. Hãy thử

my name used to be \1

hoặc là

my name used to be $1

Cũng lưu ý rằng mẫu chụp ban đầu của bạn:

my name is (\w)+

là không chính xác và sẽ chỉ nắm bắt được chữ cái cuối cùng của tên chứ không phải toàn bộ tên. Bạn nên sử dụng mẫu sau để chụp tất cả các chữ cái của tên:

my name is (\w+)

15
ngoại trừ, phải không $0?
Skylar Saveland

11
Không, $ 0 không được sử dụng làm tham chiếu ngược trong biểu thức chính quy (vì \0bằng với ký tự null và \0dddđược sử dụng làm lối thoát cho một ký tự có điểm mã ddd). Tuy nhiên, $0dường như được sử dụng trong Sublime2 như một "dấu thoát" theo trang này (mặc dù tôi gặp khó khăn khi tìm đủ ví dụ để tìm ra chính xác cách sử dụng dấu thoát trong Sublime2).
Bobious

3
Dấu thoát $0được sử dụng trong Sublime Text 2/3 để đặt con trỏ khi thoát khỏi phần mở rộng đoạn trích. Thêm về đoạn trích .
jrhorn424

2
$ 0 vẫn hoạt động để phản hồi lại toàn bộ biểu thức trong Sublime Text 2
sturrockad

2
$0là toàn bộ trận đấu regex; $1là nhóm bắt đầu tiên.
Oletha

103

Nhân tiện, trong câu hỏi trên:

Dành cho:

Hello, my name is bob

Tìm một phần:

my name is (\w)+

Với phần thay thế:

my name used to be \1

Sẽ trở lại:

Hello, my name used to be b

Thay đổi phần tìm thành:

my name is (\w+)

Và thay thế sẽ là những gì bạn mong đợi:

Hello, my name used to be bob

Mặc dù (\ w) + sẽ khớp với "bob", nhưng đây không phải là nhóm bạn muốn thay thế.


52

Quan trọng: Sử dụng ( )dấu ngoặc đơn trong chuỗi tìm kiếm của bạn

Trong khi câu trả lời trước là đúng, có một điều quan trọng cần nhấn mạnh! Tất cả các phân đoạn phù hợp trong chuỗi tìm kiếm mà bạn muốn sử dụng trong chuỗi thay thế của bạn phải được đặt ( )trong dấu ngoặc đơn , nếu không các phân đoạn phù hợp này sẽ không thể truy cập được vào các biến được xác định như $1, $2hoặc \1, \2v.v.

Ví dụ: chúng tôi muốn thay thế 'em' bằng 'px' nhưng giữ nguyên các giá trị chữ số:

    margin: 10em;  /* Expected: margin: 10px */
    margin: 2em;   /* Expected: margin: 2px */
  • Chuỗi thay thế: margin: $1pxhoặcmargin: \1px
  • Chuỗi tìm kiếm (ĐÚNG): margin: ([0-9]*)em// với dấu ngoặc đơn
  • Chuỗi tìm kiếm (INCORRECT): margin: [0-9]*em

VÍ DỤ TRƯỜNG HỢP: Sử dụng margin: ([0-9]*)emchuỗi tìm kiếm (có dấu ngoặc đơn). Kèm theo phân đoạn phù hợp mong muốn (ví dụ $1hoặc \1) bằng ( )dấu ngoặc đơn như sau:

  • Tìm: margin: ([0-9]*)em(có dấu ngoặc đơn)
  • Thay thế thành: margin: $1pxhoặcmargin: \1px
  • Kết quả:
    margin: 10px;
    margin: 2px;

VÍ DỤ TRƯỜNG HỢP INCORRECT: Sử dụng margin: [0-9]*emchuỗi tìm kiếm (không có dấu ngoặc đơn). Các mẫu biểu thức chính sau đây sẽ phù hợp với dòng mong muốn nhưng phân khúc phù hợp sẽ không có sẵn trong chuỗi thay thế như biến như $1hay \1:

  • Tìm: margin: [0-9]*em(không có dấu ngoặc đơn)
  • Thay thế thành: margin: $1pxhoặcmargin: \1px
  • Kết quả:
    margin: px; /* `$1` is undefined */
    margin: px; /* `$1` is undefined */

1
Cảm ơn bạn, câu trả lời này thực sự chỉ ra một sự thật thú vị đã giải quyết vấn đề của tôi.
Enkk

Cảm ơn đã chỉ ra điều đó. Với (), tôi có thể thay thế bằng \ 1 trong Sublime 3.
Jeffrey

47

Dưới đây là một bản trình bày trực quan của câu trả lời đã được phê duyệt.

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


Tại sao không tìm thấy $_SESSION[(\w+)? cảm ơn
Toni Michel Caubet

Vì $, [, (và,) là các ký tự đặc biệt, do đó bạn nên thoát từng ký tự đặc biệt bằng dấu gạch chéo ngược.
zeeawan

25

Lưu ý rằng nếu bạn sử dụng nhiều hơn 9 nhóm chụp, bạn phải sử dụng cú pháp ${10}.

$10hoặc \10hoặc \{10}sẽ không làm việc.


Cảm ơn! Điều này hữu ích cho tôi để thay thế và thêm một số vào cuối nhóm bị bắt, ví dụ như để thêm một 1nhóm bắt thứ hai mà bạn cần sử dụng dấu ngoặc nhọn như ${2}1; $ 21 đề cập đến nhóm bắt giữ thứ 21, không tồn tại.
Eric

1

Nhìn vào bài viết của Sublime Text Tài liệu không chính thức về Tìm kiếm và Thay thế , có vẻ như đây +(.+)là nhóm chụp mà bạn có thể muốn ... nhưng cá nhân tôi đã sử dụng (.*)và nó hoạt động tốt. Để thay thế theo cách bạn đang nói, bạn có thể thích cuộc trò chuyện này trong các diễn đàn , cụ thể là bài đăng này chỉ đơn giản là sử dụng $1để sử dụng nhóm bị bắt đầu tiên.

Và vì hình ảnh tốt hơn lời nói ...

Trước: trước khi tìm / thay thế

Sau: sau khi 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.