การอ้างอิงย้อนกลับ RegEx ใน IntelliJ


129

ฉันต้องการใช้คุณสมบัติค้นหาและแทนที่ของ IntelliJ เพื่อทำการเปลี่ยนแปลงต่อไปนี้:

// Replace this
model.put('foo', 'bar')
// With this
model['foo'] = bar

ฉันได้ลองสิ่งต่อไปนี้:

ข้อความที่ต้องการค้นหา: model.put\((.*),(.*)\) แทนที่ด้วย:model\[\\1\] = \\2

แต่ Intellij ดูเหมือนจะไม่รู้จัก\\1และ\\2เป็นข้อมูลอ้างอิง ฉันได้ลองใช้เครื่องหมายทับเพียงครั้งเดียว แต่ก็ไม่ได้ผลเช่นกัน

คำตอบ:


196

IntelliJ ใช้$1สำหรับการอ้างอิงย้อนกลับทดแทน

จากความช่วยเหลือของ IntelliJ:

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับนิพจน์ทั่วไปและไวยากรณ์โปรดดูเอกสารประกอบสำหรับjava.util.regexการอ้างอิงย้อนกลับควรมีรูปแบบ $ n แทนที่จะเป็น \ n


15
ดูเหมือนว่า "\" ไม่จำเป็นต้องใช้: jetbrains.com/idea/help/… . นอกจากนี้สำหรับฉันมันใช้ได้เฉพาะเมื่อฉันล้อมกลุ่มของฉันอย่างชัดเจนด้วย "()" มิฉะนั้นฉันจะไม่สามารถอ้างอิงได้ในภายหลัง เช่นการค้นหา(foo)แทนที่:$1bar
Ghedeon

@ Ghedeon: คุณควรเพิ่มความคิดเห็นของคุณเป็นคำตอบหรือคำตอบที่มีอยู่ คำแนะนำของคุณในการใส่นิพจน์ใน () คือสิ่งที่ได้ผลสำหรับฉัน
mindreader

+1 บิตของข้อมูลที่ช่วยแก้ปัญหาที่เกี่ยวข้องของฉัน: ฉันกำลังแทนที่เครื่องหมายคำพูดบวกห่อหุ้มรอบตัวแปรด้วยกระดาษห่อหยิกแบบดอลลาร์กล่าวคือ'+ var +'เป็น${var}ในสตริงเทมเพลตบางรายการและคิดไม่ออกว่าทำไม intellij จึงไม่ทำการแทนที่ให้เสร็จสิ้น ปรากฎว่า$ต้องมีการหลบหนีในการเปลี่ยน
worc

13

ในระยะสั้นคุณต้องใช้$1เพื่อ$nสำหรับการเปลี่ยน backreferences \1ไวยากรณ์ใช้สำหรับการอ้างอิงย้อนกลับภายในการค้นหาเท่านั้น

ใน IntelliJ 2016 เอกสารในแอปทำให้เข้าใจผิด นี่คือคำพูดที่ดีกว่าจากเอกสารฉบับเต็ม:

หากคุณต้องการอ้างอิงสตริงย่อยที่ตรงกันนอกนิพจน์ทั่วไปในปัจจุบัน (ตัวอย่างเช่นในนิพจน์ทั่วไปอื่นเป็นสตริงแทนที่) คุณสามารถเรียกดูโดยใช้เครื่องหมายดอลลาร์ ($ num โดยที่ num = 1..n)

ที่มา: ไวยากรณ์นิพจน์ทั่วไป 2016.1, Tips & Tricks


2

ความช่วยเหลือตามบริบทในผลิตภัณฑ์สำหรับ regex ใน Idea 9.0 (และอาจเป็นเวอร์ชันอื่น ๆ ) ดูเหมือนจะไม่ถูกต้อง ระบุสิ่งนี้:

  การอ้างอิงย้อนกลับ
  \ n
  ไม่ว่ากลุ่มการจับภาพที่ n จะจับคู่แบบใด

แต่เห็นได้ชัดว่าตามที่กล่าวไว้ในคำตอบก่อนหน้านี้และเป็นประสบการณ์ของฉันมันเป็น \ $ n สำหรับการอ้างอิงกลับมากกว่า \ n

คุณจะได้รับความช่วยเหลือตามบริบทนี้โดยคลิกลิงก์ "[Help]" ถัดจากตัวเลือกวิทยุ "นิพจน์ทั่วไป" ในกล่องโต้ตอบ "แทนที่ข้อความ"


0

IntelliJ IDEA / Reference / Regular Expression Syntax Reference


จับคู่นิพจน์ย่อยและจดจำการจับคู่ หากคุณต้องการใช้สตริงย่อยที่ตรงกันภายในนิพจน์ทั่วไปเดียวกันคุณสามารถดึงข้อมูลได้โดยใช้ backreference (\ num โดยที่ num = 1..n) หากคุณต้องการอ้างอิงสตริงย่อยที่ตรงกันนอกนิพจน์ทั่วไปในปัจจุบัน (ตัวอย่างเช่นในนิพจน์ทั่วไปอื่นในฟิลด์การแทนที่) คุณสามารถเรียกดูโดยใช้เครื่องหมายดอลลาร์ ($ num โดยที่ num = 1..n) หากคุณต้องการรวมอักขระในวงเล็บไว้ในนิพจน์ย่อยให้ใช้ "(" หรือ ")"


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