มีวิธีใดบ้างที่จะทำให้ Visual Studio ทำการแทนที่ regex ในหลาย ๆ บรรทัด (ให้การจับคู่ข้ามเส้นแบ่งขอบเขต) ฉันรู้ว่ามีเครื่องมือแก้ไขมากมายที่ฉันสามารถใช้เพื่อสิ่งนี้ได้ แต่ดูเหมือนว่าจะแปลกที่ฟีเจอร์นี้ถูกทิ้งไว้จาก Visual Studio ฉันพลาดอะไรไปรึเปล่า?
มีวิธีใดบ้างที่จะทำให้ Visual Studio ทำการแทนที่ regex ในหลาย ๆ บรรทัด (ให้การจับคู่ข้ามเส้นแบ่งขอบเขต) ฉันรู้ว่ามีเครื่องมือแก้ไขมากมายที่ฉันสามารถใช้เพื่อสิ่งนี้ได้ แต่ดูเหมือนว่าจะแปลกที่ฟีเจอร์นี้ถูกทิ้งไว้จาก Visual Studio ฉันพลาดอะไรไปรึเปล่า?
คำตอบ:
ใช้กล่องโต้ตอบแทนที่ในไฟล์Ctrl- Shift- Hและตัวเลือกบรรทัดเดียว(?s)
:
(?s)start.*end
พบ
start
two
three
end
วิธี Singleline: แต่ละไฟล์จะถือว่าเป็นบรรทัดเดียวจุดไม้ขีดไฟขึ้นบรรทัดใหม่.
\n
ข้อเสีย: คุณต้องใช้Find Allและแทนที่ทั้งหมดหรือแทนที่ด้วยมือ ค้นหาถัดไปไม่ทำงาน
สำหรับกล่องโต้ตอบที่ไม่ใช่โมดอลCtrl- Hและค้นหาถัดไปใช้(.*\n)*
เพื่อจับคู่บรรทัดจำนวนเท่าใดก็ได้:
start(.*\n)*.*end
\n
ทั้งสองวิธีที่คุณสามารถแทนที่การค้นพบของคุณกับหลายบรรทัดโดยการใส่
start
end
หากคุณต้องการค้นหาend
เวอร์ชันถัดไปให้ใช้แบบไม่โลภ: (?s)start.*?end
, หรือstart(.*\n)*?.*?end
.
(?s)
หรือไม่?
การแสดงออกปกติมีการเปลี่ยนแปลงใน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 และ.*
สำหรับการจับคู่แท็บที่เป็นไปได้ / ช่องว่าง
วันนี้ใช้งานได้ใน Visual Studio 2012:
fooPatternToStart.*(.*\n)+?.*barPatternToEnd
ดูว่าชิ้น(.*\n)+?
ส่วนนั้นจับคู่กันอย่างไรในหลาย ๆ บรรทัดโดยไม่โลภ
fooPatternToStart
เป็นรูปแบบ regex บนเส้นเริ่มต้นของคุณในขณะที่barPatternToEnd
รูปแบบของคุณที่จะพบในบรรทัดอื่นด้านล่างอาจมีหลายบรรทัดด้านล่าง ...
ง่ายและมีประสิทธิภาพ :)
หมายเหตุ: ก่อน VS2012 รูปแบบที่ใช้ได้คือ:fooPatternToStart.(.\n)+@.*barPatternToEnd
sprintf.*(.*\n)+?.*log.*(.*\n)+?.*__func__
ทำงานเพื่อค้นหาlog
ระหว่างsprintf
และ__func__
ขอบคุณ! โธ่ .. ดูเหมือนว่าจะดูไม่มีที่สิ้นสุดสำหรับสิ่งนั้น .. หากมีเพียงวิธีการ จำกัด ปริมาณเส้น
หมายเหตุ: คำตอบนี้ใช้ไวยากรณ์ regex ที่ใช้ใน Visual Studio จนถึง VS 2012 ใน VS 2013 และใหม่กว่าไวยากรณ์ regex มีการเปลี่ยนแปลง
คุณสามารถรวม\n
ไว้ในนิพจน์ ตัวอย่างเช่นนี่คือนิพจน์ทั่วไปที่ฉันใช้เพื่อ "ล้าง" สคริปต์ SQL ที่สร้างขึ้นโดยอัตโนมัติจากสิ่งที่ไม่ใช่โพรซีเดอร์ที่เก็บไว้ (จะจับคู่บล็อกข้อความที่ขึ้นต้นด้วยบรรทัดที่มี "Object:" ตามด้วยสิ่งที่ไม่ใช่ "StoredProcedure" จากนั้นจับคู่บรรทัดต่อไปนี้จนถึงบรรทัดประกอบด้วยคำว่า "GO"):
/\*+ Object\::b:b~(StoredProcedure)(.*\n)#GO\n
คุณอาจต้องใช้ \ r \ n ต่อท้ายนิพจน์ของคุณ
การจับภาพอักขระหลายบรรทัดแบบไม่โลภ Visual Studio 2013+:
.*?\r?\n.*?
เวอร์ชั่นโลภในคำตอบของ Giles Roberts
สำหรับทุกคนที่มาที่นี่ในขณะที่ค้นหา VS Code ฉันใช้สิ่งนี้เพื่อจับคู่อะไรก็ได้จากscript
ทุกที่ด้วย 2 บรรทัดใหม่ (ไม่รวมบรรทัดใหม่):
script(.|\n)+?(?=\n\n)
แทนที่script
และ\n\n
จับคู่ทุกอย่างระหว่างกัน
end
) ดังนั้นจึงไม่ต้องโลภ เช่น:start(.*\n)*.*?end