คุณอ้างอิงกลุ่มการดักจับด้วยการค้นหาและแทนที่ regex ใน Visual Studio 2012, 2013, 2015 และรหัส VS อย่างไร


254

ฉันรู้ว่ามีคำถามมากมายเกี่ยวกับสิ่งนี้ แต่ไม่มีสิ่งใดที่ฉันพบว่ามีการอ้างอิงโดยเฉพาะกับเวอร์ชัน VS ที่พวกเขาอ้างถึง เมื่อขาดข้อมูลสำคัญนั้นฉันก็ยังไม่สามารถใช้คำตอบที่พบได้สำเร็จ ที่พบมากที่สุดคือ

  • ล้อมรอบด้วย {} จับการแสดงผลด้วย \ 1, \ 2, \ n

อย่างไรก็ตามดูเหมือนว่าจะเป็นวิธีการเก่าในการค้นหาและแทนที่ regex ใน Visual Studio และจะไม่ทำงานใน VS 2012


1
การค้นหานี้ไม่ยากเกินไป: ในกล่องโต้ตอบค้นหา / แทนที่, F1; ในช่วงต้นของการค้นหาและการแทนที่ข้อความมีลิงก์ไปยังการใช้นิพจน์ปกติใน VS ; มีเคล็ดลับที่ 2 หมายถึงคุณแทนในการแสดงผลปกติ ; มีจะช่วยให้คุณพื้นฐานและกล่าวว่ามีรายละเอียดมากขึ้นภายใต้แทนเลขกลุ่มและทำหน้าที่แทนชื่อกลุ่ม
— PJTraill

2
@PJTraill เป็นเรื่องดีที่รู้ว่าพวกเขาทำให้ง่ายต่อการตอบคำถามสำหรับรุ่น 2012 ของพวกเขาในช่วงระหว่างปี 2556 ถึง 2558 อย่างไรก็ตามจากการโหวตฉันคิดว่ามันค่อนข้างชัดเจนว่ายังไม่ "ไม่ยากเกินไป" ในการช่วยเหลือ IMO: หากการค้นหาและออกเสียงลงคะแนนในบทความล้นสแต็กง่ายกว่าการใช้การค้นหาแทนที่จับภาพโดยไม่ต้องค้นหาความช่วยเหลือเลยมันยากกว่าที่ควร
— SgtPooki

สิ่งหนึ่งที่ทำให้ฉันสับสนเกี่ยวกับ MSVS 2012/3 คือกล่องโต้ตอบการค้นหา / แทนที่ที่แตกต่างกันสองรายการโดยเฉพาะอย่างยิ่งกล่องขนาดเล็ก (Ctrl-H) ที่ฉันเก็บไว้โดยไม่ตั้งใจ (ด้วยการกดแป้นอาจหมายถึงอย่างอื่น) เปลี่ยนขอบเขตของการค้นหา . แต่จุดที่ฉันต้องการทำคือกล่องโต้ตอบขนาดใหญ่ (Ctrl-Shift-H) มีปุ่มหลังจากฟิลด์ค้นหาและแทนที่ที่ให้รายการความเป็นไปได้ที่สำคัญยิ่งขึ้นรวมถึงสิ่งที่คุณกำลังมองหา - ดังนั้นคุณจึงไม่ ต้องการความช่วยเหลือ! ฉันเดาว่าหลายคนอาจจะไม่เห็นปุ่มหรือจุดจอดในกล่องโต้ตอบ Ctrl-H และมองไม่เห็น
— PJTraill

ฉันเห็นด้วยว่าการช่วยเหลือเป็นเรื่องยุ่งยากที่ต้องค้นหา ฉันสงสัยว่าพวกเขาให้ความสำคัญกับการค้นหาข้อความธรรมดา ประเด็นของฉันคือยิ่งกว่านั้นถ้าใครรู้หรือสมมติว่ามันต้องอยู่ที่นั่นอย่างใดอย่างหนึ่งสามารถหาได้ง่ายพอสมควร; บ่อยครั้งที่ฉันทำตามเส้นทางนั้นเนื่องจากฉันต้องการใช้เอกสารที่เป็นที่ยอมรับเมื่อฉันสามารถค้นหาได้ ฉันไม่ได้ตั้งใจฟังดูถูก; ฉันคิดว่าทั้ง "ยากเกินไป" และ "ไม่ยากเกินไป" - พวกเขาจะไม่ตรงกันข้ามถ้าคุณเห็นว่า "ไม่มากเกินไป" ในฐานะที่มีคุณสมบัติ "ยาก" และเพิ่มคำตอบสำหรับความหมายโดยนัยว่า "ยากสำหรับอะไร"
— PJTraill

ฉัน "รู้" ว่าการติดแท็ก REGEXP กำลังใช้ '()' อ่านเอกสารอีกครั้งและมันใช้งานไม่ได้ ... ดังนั้นฉันมาที่นี่เพื่อให้แน่ใจว่า ... จากนั้นฉันทำการทดลองเพิ่มเติมและใช้งานได้ ดังนั้น IMHO เอกสาร MSDN จะต้องมีความชัดเจนเป็นพิเศษว่า () ใช้ในการ "แท็ก" การแสดงออกสำหรับพวกเราที่ต้องเรียนรู้การตั้งชื่อ VS6 "แท็ก" เก่า มันจะดีถ้าพวกเขาสามารถใช้ระบบการตั้งชื่อแบบเดียวกัน กลุ่มที่มีหมายเลข ... เพียง แต่ไม่ได้ทำให้การซิงโครไนซ์ดีพอ IMHO
— Ross Youngblood

คำตอบ:


355

ในการค้นหาและแทนที่ใน VS 2012 และ VS 2015 ให้ทำดังต่อไปนี้:

ตัวอย่าง (ขอบคุณ syonip)

ในตัวเลือกการค้นหาตรวจสอบให้แน่ใจว่าได้เลือก 'ใช้นิพจน์ปกติ' และใส่ข้อความต่อไปนี้เป็นข้อความเพื่อค้นหา:

_platformActions.InstallApp\((.+)\)

และต่อไปนี้เป็นข้อความที่จะแทนที่ด้วย:

this.Platform().App($1).Install()

หมายเหตุ:เนื่องจาก SLaks ชี้ให้เห็นในความคิดเห็นด้านล่างการเปลี่ยนแปลงในไวยากรณ์ regex เกิดจากการ VS2012 สลับไปยังเครื่องยนต์. Net regex มาตรฐาน

หมายเหตุ: ผู้วิจารณ์คนอื่นชี้ให้เห็นว่าวิธีนี้ใช้ได้ใน Visual Studio Code (vscode) เช่นกัน


10
เพื่อให้เป็นทั่วไปมากขึ้นตอนนี้ VS2012 ใช้เอ็นจิ้น. net regex มาตรฐาน
— SLAK

4
คุณไม่จำเป็นต้องหลบหนีช่วงเวลาระหว่าง_platformActionsและInstallApp?
— rory.ap

เมื่อคิดถึงตอนนี้มันจะสมเหตุสมผล ฉันยังไม่ได้ทดสอบ อย่าลังเลที่จะโยนการแก้ไขในที่นั่น
— SgtPooki

1
จบลงฉันใช้ชื่อเป็นตัวเลขดูเหมือนจะไม่ทำงานสำหรับฉันอย่างน้อย (?<rval>.+)ในการค้นหาและแทนที่${rval}
— Mark Schultheiss

2
ความช่วยเหลือพิเศษบางอย่าง: หากคุณต้องการแทนที่สิ่งของ (. *) ด้วยสิ่ง $ 18 (เพิ่ม '8' โดยตรงหลังจากการจับ) คุณจะต้องใช้สิ่ง $ {1} 8
— Luc Bloom

17

เพื่อเพิ่มตัวอย่างนี้นี่คือสิ่งที่ฉันต้องทำในรหัสของฉัน:

หาอะไร:

_platformActions.InstallApp\((.+)\)

แทนที่ด้วย:

this.Platform().App($1).Install()

สิ่งนี้จะแทนที่การเรียกไปยัง InstallApp (x) ด้วย this.Platform (). App (x) .Install ()

* อย่าลืมทำเครื่องหมาย "ใช้การแสดงออกปกติ" ในตัวเลือกการค้นหา


10

หากคุณต้องการทำงานกับการใช้ชื่อกลุ่ม (ใช้ตัวอย่างเดียวกันกับด้านบน):

หาอะไร:

_platformActions\.InstallApp\((?<mygroupname>.+)\)

แทนที่ด้วย:

this.Platform().App(${mygroupname}).Install()

9

เพื่อปรับปรุงคำตอบข้างต้น: คุณควรแทนที่

_platformActions.InstallApp\((.+)\)

กับ

this.Platform().App(${1}).Install()

คำนึงถึง$ {1}หากคุณต้องการเพิ่มตัวเลขไว้ด้านหลังการจับ $18จะพยายามแทรกการดักจับการค้นหาครั้งที่ 18 ไม่ใช่อันแรกที่8ต่อท้าย

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