Biểu thức chính quy nhiều dòng trong Visual Studio


87

Có cách nào để Visual Studio thực hiện thay thế regex trên nhiều dòng (cho phép các đường ranh giới đối sánh chéo) không? Tôi biết có nhiều trình chỉnh sửa mà tôi có thể sử dụng cho việc này, nhưng có vẻ lạ là tính năng này đã bị loại khỏi Visual Studio. Tui bỏ lỡ điều gì vậy?

Câu trả lời:


25

Sử dụng hộp thoại thay thế trong tệp Ctrl- Shift- Hvà tùy chọn dòng đơn (?s):

(?s)start.*end

tìm thấy

start
two
three
end

Singleline có nghĩa là: mỗi tệp được coi là một dòng, dấu chấm .khớp với dòng mới \n. Nhược điểm: bạn phải sử dụng Find All và thay thế tất cả, hoặc thay thế bằng tay. Tìm tiếp theo không hoạt động.

Đối với hộp thoại không theo phương thức Ctrl- Hvà tìm tiếp theo, sử dụng (.*\n)*để khớp với bất kỳ số dòng nào:

start(.*\n)*.*end

Dù bằng cách nào, bạn có thể thay thế các phát hiện của mình bằng nhiều dòng bằng cách chèn \n.


điều này hoạt động nhưng bạn muốn có thêm dấu chấm hỏi (trước đó end) vì vậy nó không tham lam. tức là:start(.*\n)*.*?end
CAD bloke

4
Phiên bản tham lam khớp càng nhiều ký tự càng tốt giữa startend. Nếu bạn muốn tìm bản tiếp theo, hãy endsử dụng phiên bản không tham lam: (?s)start.*?endhoặc start(.*\n)*?.*?end.
Stephan Stamm

Lưu ý cho người dùng sẽ là: không hoạt động kể từ Visual Studio 2013. Xem câu trả lời của Giles Roberts.
relatively_random

@relied_random: Bạn có gặp sự cố khi sử dụng (?s)không?
Stephan Stamm

Vâng, tôi đã làm. Nó vẫn hoạt động cho bạn trên các phiên bản VS mới hơn?
relatively_random

72

Biểu thức chính quy đã thay đổi trong Visual Studio 2013 . https://msdn.microsoft.com/en-us/library/2k3te2cs(v=vs.120).aspx

Để so khớp một biểu thức trên hai dòng, mã bây giờ sẽ là:

StartOfExpression.*\r?\n.*EndOfExpression


Cảm ơn bạn, làm việc này một cách hoàn hảo, </label>.*\r?\n.*<divnơi \r?\nlà điều hiển nhiên carriage_return-NEW_LINE và .*cho phù hợp với các tab có thể / không gian
Sam

Tôi gặp lỗi "Literal '\ n' hiện không được hỗ trợ"
ELI7VH 29/08/18

@ ELI7VH Tôi không thể lặp lại lỗi của bạn. Bạn đang sử dụng phiên bản Visual Studio nào?
Giles Roberts,

25

Điều này ngày nay hoạt động trong Visual Studio 2012:

fooPatternToStart.*(.*\n)+?.*barPatternToEnd

Xem cách (.*\n)+?phần khớp trên nhiều dòng, không tham lam.
fooPatternToStartlà một số mẫu regex trên dòng bắt đầu của bạn, trong khi đó barPatternToEndlà mẫu bạn cần tìm trên một dòng khác bên dưới, có thể nhiều dòng bên dưới ...

Ví dụ được tìm thấy ở đây .

Đơn giản và hiệu quả :)

Lưu ý: trước VS2012, mẫu hoạt động là:fooPatternToStart.(.\n)+@.*barPatternToEnd


4
lưu ý visual studio 2012 sử dụng động cơ regex tương tự cho tìm / thay thế như trong mã, do đó trở nên trên: fooPatternToStart * * * barPatternToEnd. (* \ n.)?.
Brent

@Brent: được cấp phép, các phiên bản VSTO gần đây hơn đã khắc phục sự cố đó.
woohoo

điều gì sẽ xảy ra nếu tôi muốn tìm kiếm một văn bản cụ thể trong khoảng thời gian bắt đầu và dừng lại? như thế này? : Chỉnh sửa: sprintf.*(.*\n)+?.*log.*(.*\n)+?.*__func__hoạt động để tìm kiếm loggiữa sprintf__func__, cảm ơn! Tho .. có vẻ như nhìn vào vô hạn cho điều đó .. nếu chỉ có một cách để giới hạn số lượng dòng
Gizmo

19

Lưu ý: câu trả lời này sử dụng cú pháp regex được sử dụng trong Visual Studio cho đến và bao gồm VS 2012. Trong VS 2013 trở lên, cú pháp regex đã thay đổi.

Bạn có thể đưa \nvào biểu thức. Ví dụ: đây là một regex mà tôi sử dụng để "làm sạch" các tập lệnh SQL được tạo tự động khỏi bất kỳ thứ gì không phải là một thủ tục được lưu trữ (nó sẽ khớp với các khối văn bản bắt đầu bằng một dòng có chứa "Đối tượng:" theo sau là một cái gì đó không "StoredProcedure", sau đó nối các dòng sau thành một dòng bao gồm từ "GO"):

/\*+ Object\::b:b~(StoredProcedure)(.*\n)#GO\n

Lưu ý: Dấu chấm cuối dòng phụ thuộc vào định dạng của tệp, vì vậy chỉ sử dụng \ n cho văn bản kiểu Unix, \ r cho văn bản kiểu Mac hoặc \ r \ n cho văn bản kiểu windows.
James Wilkins

2
Lưu ý II: hãy đảm bảo rằng bạn không đánh dấu "Khớp toàn bộ từ" cùng một lúc, nếu không điều này không hoạt động!
Ed Graham

1
Bạn có thể thêm ghi chú nói rằng câu trả lời này chỉ áp dụng cho Visual Studio 2012 trở lên không?
Giles Roberts

3

bạn có thể cần sử dụng \ r \ n ở cuối biểu thức của mình.


1

Không tham lam nhiều dòng khi chụp bất kỳ ký tự nào, Visual Studio 2013+:

.*?\r?\n.*?

Phiên bản tham lam trong câu trả lời của Giles Roberts.


0

Đối với tất cả mọi người đến đây trong khi tìm kiếm VS Code, tôi sử dụng điều này để so khớp mọi thứ từ scriptđến bất kỳ đâu với 2 dòng mới (loại trừ dòng mới):

script(.|\n)+?(?=\n\n)

thay thế script\n\nđể khớp mọi thứ giữa chúng.

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.