ค้นหาคลาสที่มีเมธอดชื่อเดียวกัน

ฉันกำลังพยายามค้นหาไฟล์ในโค้ด Visual Studio ซึ่งเนื้อหามีคลาสที่มีวิธีการชื่อเดียวกัน ตัวอย่างเช่น เนื้อหาต่อไปนี้ควรตรงกัน:

class Hello {
    ...
    function Hello() { ... }
    ...
}

ไม่ว่าในกรณีใด ฉันพยายามสร้าง regex สำหรับ class\s([A-Za-z_]+)[^]*(function\s\1) นี้ และดูเหมือนว่าจะทำงานได้ดี เมื่อฉันพยายามค้นหาไฟล์ในโค้ด Visual Studio มันเกิดข้อผิดพลาดที่ระบุว่า: "ไม่อนุญาตให้ใช้การอ้างอิงแบบผกผัน"

มีวิธีง่ายๆ ในการทำสิ่งที่ฉันต้องการที่นี่หรือไม่? regex ของฉันมีรูปแบบไม่ดีหรือไม่?


person Tomás Juárez    schedule 30.10.2018    source แหล่งที่มา
comment
มันมีรูปร่างไม่ดี แทนที่ [^] ด้วย [\s\S\r] class\s([A-Za-z_]+)[\s\S\r]*(function\s\1) ตรงกับสิ่งที่คุณต้องการหรือไม่   -  person Wiktor Stribiżew    schedule 30.10.2018
comment
ฉันลองใช้ class\s([A-Za-z_]+)[\s\S\r]*(function\s\1) แล้ว แต่ใช้ไม่ได้กับ Visual Studio   -  person Tomás Juárez    schedule 30.10.2018
comment
มันเป็น Visual Studio หรือ VSCode? ฉันเพิ่งลอง class\s+([A-Za-z_]+)[\s\S\r]*(function\s\1\b) และทำงานได้อย่างสมบูรณ์แบบใน Visual Studio S&R   -  person Wiktor Stribiżew    schedule 30.10.2018
comment
มันเป็นรหัส Visual Studio ขออภัย   -  person Tomás Juárez    schedule 30.10.2018


คำตอบ (1)


คุณควรแทนที่ [^] ด้วย [\s\S\r]

รูปแบบที่ควรได้ผลก็คือ

class\s([A-Za-z_]+)[\s\S\r]*(function\s\1)

หรืออาจเป็นเวอร์ชันที่แม่นยำกว่านี้:

class\s+([A-Za-z_]+)\b[\s\S\r]*?(function\s+\1\b)
       ^            ^^         ^              ^^

รายละเอียด

  • class - สตริงย่อยตามตัวอักษร
  • \s+ - ช่องว่าง 1 ช่องขึ้นไป
  • ([A-Za-z_]+) - กลุ่ม 1: 1 ตัวอักษรขึ้นไป หรือ _
  • \b - ขอบเขตคำ
  • [\s\S\r]*? - ตัวอักษรตั้งแต่ 0 ตัวขึ้นไปให้น้อยที่สุด
  • (function\s+\1\b) - กลุ่ม 2: fuinction, ช่องว่าง 1+, ค่ากลุ่ม 1 และขอบเขตคำ

ป้อนคำอธิบายรูปภาพที่นี่

person Wiktor Stribiżew    schedule 30.10.2018
comment
ดูเหมือนว่าจะดี ไม่ว่าในกรณีใด มันจะใช้งานได้หรือไม่หากคุณพยายามค้นหาไฟล์ที่มีเนื้อหานั้น เนื่องจากฉันใช้ regex ในบริบทของไฟล์ค้นหา (ฉันไม่ได้พยายามค้นหาภายในไฟล์ใดไฟล์หนึ่ง) และ regex ไม่ตรงกับไฟล์ใด ๆ โปรดทราบว่าฉันมีไฟล์ประเภทนั้นเยอะมาก ดังนั้นควรมีอย่างน้อย 350 ไฟล์ - person Tomás Juárez; 30.10.2018
comment
@ TomásJuárezเอ็นจิ้น Find in Files regex ใช้เครื่องมือ Rust regex ที่ไม่รองรับการอ้างอิงย้อนกลับ ฉันคิดว่าคุณไม่สามารถใช้ regex ใน Find in Files ได้ โปรดทราบว่าคุณสามารถใช้คุณสมบัติเดียวกันใน Notepad ++ ได้ (มีกล่องโต้ตอบค้นหาในไฟล์ด้วย) - person Wiktor Stribiżew; 30.10.2018
comment
ฉันลองใช้ VSCode และ Atom แล้วทั้งสองอย่างไม่ได้ผล โปรแกรมแก้ไขข้อความเพียงตัวเดียวที่สามารถค้นหาไฟล์ให้ฉันในลักษณะนั้นได้คือ SublimeText 3 ดังนั้น regex ของคุณจึงใช้งานได้อย่างมีเสน่ห์ ขอบคุณมากสำหรับความช่วยเหลือของคุณ! - person Tomás Juárez; 30.10.2018
comment
@ TomásJuárez เยี่ยมมากใช่แล้ว Suiblime Text 3 ขับเคลื่อนด้วย PCRE มันจะทำงานกับการค้นหาและการอ้างอิงย้อนกลับ - person Wiktor Stribiżew; 30.10.2018