นิพจน์ทั่วไปหลายบรรทัดใน Visual Studio


87

มีวิธีใดบ้างที่จะทำให้ Visual Studio ทำการแทนที่ regex ในหลาย ๆ บรรทัด (ให้การจับคู่ข้ามเส้นแบ่งขอบเขต) ฉันรู้ว่ามีเครื่องมือแก้ไขมากมายที่ฉันสามารถใช้เพื่อสิ่งนี้ได้ แต่ดูเหมือนว่าจะแปลกที่ฟีเจอร์นี้ถูกทิ้งไว้จาก Visual Studio ฉันพลาดอะไรไปรึเปล่า?

คำตอบ:


24

ใช้กล่องโต้ตอบแทนที่ในไฟล์Ctrl- Shift- Hและตัวเลือกบรรทัดเดียว(?s):

(?s)start.*end

พบ

start
two
three
end

วิธี Singleline: แต่ละไฟล์จะถือว่าเป็นบรรทัดเดียวจุดไม้ขีดไฟขึ้นบรรทัดใหม่. \nข้อเสีย: คุณต้องใช้Find Allและแทนที่ทั้งหมดหรือแทนที่ด้วยมือ ค้นหาถัดไปไม่ทำงาน

สำหรับกล่องโต้ตอบที่ไม่ใช่โมดอลCtrl- Hและค้นหาถัดไปใช้(.*\n)*เพื่อจับคู่บรรทัดจำนวนเท่าใดก็ได้:

start(.*\n)*.*end

\nทั้งสองวิธีที่คุณสามารถแทนที่การค้นพบของคุณกับหลายบรรทัดโดยการใส่


ใช้งานได้ แต่คุณต้องการเครื่องหมายคำถามพิเศษ (ก่อนหน้าend) ดังนั้นจึงไม่ต้องโลภ เช่น:start(.*\n)*.*?end
CAD bloke

4
รุ่นโลภตรงกับตัวละครมากที่สุดเท่าที่เป็นไปได้ระหว่างและstart endหากคุณต้องการค้นหาendเวอร์ชันถัดไปให้ใช้แบบไม่โลภ: (?s)start.*?end, หรือstart(.*\n)*?.*?end.
Stephan Stamm

หมายเหตุสำหรับผู้ใช้: ใช้ไม่ได้ตั้งแต่ Visual Studio 2013 ดูคำตอบของ Giles Roberts
ค่อนข้าง

@relIKE_random: คุณมีปัญหาในการใช้งาน(?s)หรือไม่?
Stephan Stamm

ใช่ฉันทำ. มันยังใช้ได้กับคุณใน VS เวอร์ชันใหม่ ๆ หรือไม่?
ค่อนข้าง

72

การแสดงออกปกติมีการเปลี่ยนแปลงในVisual Studio 2013 https://msdn.microsoft.com/en-us/library/2k3te2cs(v=vs.120).aspx

ในการจับคู่นิพจน์มากกว่าสองบรรทัดตอนนี้โค้ดจะเป็น:

StartOfExpression.*\r?\n.*EndOfExpression


ขอบคุณงานนี้ได้อย่างสมบูรณ์แบบ</label>.*\r?\n.*<divที่\r?\nเป็นที่เห็นได้ชัด carriage_return-NEW_LINE และ.*สำหรับการจับคู่แท็บที่เป็นไปได้ / ช่องว่าง
แซม

ฉันได้รับข้อผิดพลาด "ไม่รองรับ Literal '\ n' ในขณะนี้"
ELI7VH

@ ELI7VH ฉันไม่สามารถจำลองข้อผิดพลาดของคุณได้ คุณใช้ Visual Studio เวอร์ชันใด
Giles Roberts

26

วันนี้ใช้งานได้ใน Visual Studio 2012:

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

ดูว่าชิ้น(.*\n)+?ส่วนนั้นจับคู่กันอย่างไรในหลาย ๆ บรรทัดโดยไม่โลภ
fooPatternToStartเป็นรูปแบบ regex บนเส้นเริ่มต้นของคุณในขณะที่barPatternToEndรูปแบบของคุณที่จะพบในบรรทัดอื่นด้านล่างอาจมีหลายบรรทัดด้านล่าง ...

ตัวอย่างที่พบที่นี่

ง่ายและมีประสิทธิภาพ :)

หมายเหตุ: ก่อน VS2012 รูปแบบที่ใช้ได้คือ:fooPatternToStart.(.\n)+@.*barPatternToEnd


4
note visual studio 2012 ใช้เอนจิ้น regex เดียวกันสำหรับค้นหา / แทนที่ภายในโค้ดดังนั้นด้านบนจึงกลายเป็น: fooPatternToStart * (. * \ n) *?. * barPatternToEnd
Brent

@ เบรนต์: ได้รับ VSTO เวอร์ชันล่าสุดได้แก้ไขปัญหานั้นแล้ว
woohoo

จะเป็นอย่างไรหากฉันต้องการค้นหาข้อความโดยเฉพาะระหว่างเริ่มต้นและหยุด แบบนี้? : แก้ไข: sprintf.*(.*\n)+?.*log.*(.*\n)+?.*__func__ทำงานเพื่อค้นหาlogระหว่างsprintfและ__func__ขอบคุณ! โธ่ .. ดูเหมือนว่าจะดูไม่มีที่สิ้นสุดสำหรับสิ่งนั้น .. หากมีเพียงวิธีการ จำกัด ปริมาณเส้น
Gizmo

19

หมายเหตุ: คำตอบนี้ใช้ไวยากรณ์ regex ที่ใช้ใน Visual Studio จนถึง VS 2012 ใน VS 2013 และใหม่กว่าไวยากรณ์ regex มีการเปลี่ยนแปลง

คุณสามารถรวม\nไว้ในนิพจน์ ตัวอย่างเช่นนี่คือนิพจน์ทั่วไปที่ฉันใช้เพื่อ "ล้าง" สคริปต์ SQL ที่สร้างขึ้นโดยอัตโนมัติจากสิ่งที่ไม่ใช่โพรซีเดอร์ที่เก็บไว้ (จะจับคู่บล็อกข้อความที่ขึ้นต้นด้วยบรรทัดที่มี "Object:" ตามด้วยสิ่งที่ไม่ใช่ "StoredProcedure" จากนั้นจับคู่บรรทัดต่อไปนี้จนถึงบรรทัดประกอบด้วยคำว่า "GO"):

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

หมายเหตุ: ตัวยุติบรรทัดขึ้นอยู่กับรูปแบบของไฟล์ดังนั้นให้ใช้เฉพาะ \ n สำหรับข้อความสไตล์ Unix, \ r สำหรับข้อความสไตล์ Mac หรือ \ r \ n สำหรับข้อความสไตล์ Windows
James Wilkins

2
หมายเหตุ II: ตรวจสอบให้แน่ใจว่าคุณไม่มีเครื่องหมาย "ตรงกันทั้งคำ" ในเวลาเดียวกันมิฉะนั้นจะไม่ได้ผล!
Ed Graham

1
คุณช่วยเพิ่มหมายเหตุว่าคำตอบนี้ใช้ได้กับ Visual Studio 2012 และเก่ากว่าได้ไหม
Giles Roberts


1

การจับภาพอักขระหลายบรรทัดแบบไม่โลภ Visual Studio 2013+:

.*?\r?\n.*?

เวอร์ชั่นโลภในคำตอบของ Giles Roberts


0

สำหรับทุกคนที่มาที่นี่ในขณะที่ค้นหา VS Code ฉันใช้สิ่งนี้เพื่อจับคู่อะไรก็ได้จากscriptทุกที่ด้วย 2 บรรทัดใหม่ (ไม่รวมบรรทัดใหม่):

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

แทนที่scriptและ\n\nจับคู่ทุกอย่างระหว่างกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.