ค้นหานิพจน์ปกติแทนที่ใน Sublime Text 2


440

ฉันต้องการค้นหาแทนที่ด้วยนิพจน์ทั่วไปใน Sublime Text 2 เอกสารเกี่ยวกับเรื่องนี้ค่อนข้างเป็นโลหิตจาง โดยเฉพาะฉันต้องการทำการแทนที่กลุ่มดังนั้นบางอย่างเช่นการแปลงข้อความนี้:

Hello my name is bob

และคำค้นหานี้:

หาอะไร: my name is (\w)+

แทนที่ด้วย: my name used to be $(1)

ข้อความค้นหาใช้งานได้ดี แต่ฉันไม่สามารถหาวิธีที่จะทำการแทนที่โดยใช้กลุ่ม regexp ได้

คำตอบ:


584

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

my name used to be \1

หรือ

my name used to be $1

โปรดทราบว่ารูปแบบการจับภาพดั้งเดิมของคุณ:

my name is (\w)+

ไม่ถูกต้องและจะจับตัวอักษรสุดท้ายของชื่อแทนที่จะเป็นทั้งชื่อ คุณควรใช้รูปแบบต่อไปนี้เพื่อรวบรวมตัวอักษรทั้งหมดของชื่อ:

my name is (\w+)

15
ยกเว้นมันไม่ใช่$0เหรอ?
Skylar Saveland

11
ไม่ $ 0 ไม่ได้ใช้เป็นข้อมูลอ้างอิงย้อนกลับในนิพจน์ทั่วไป (เพราะ\0เท่ากับอักขระ null และ\0dddใช้เป็น escape สำหรับอักขระที่มีรหัสจุด ddd) อย่างไรก็ตาม$0ดูเหมือนว่าจะใช้ใน Sublime2 เป็น "เครื่องหมายทางออก" ตามหน้านี้ (แม้ว่าฉันจะมีปัญหาในการหาตัวอย่างเพียงพอที่จะทำงานออกมาอย่างชัดเจนว่าจะใช้เครื่องหมายทางออกใน Sublime2 ได้อย่างไร)
Bobulous

3
เครื่องหมายออก$0จะใช้ใน Sublime Text 2/3 เพื่อวางเคอร์เซอร์เมื่อออกจากการขยายตัวอย่าง เพิ่มเติมเกี่ยวกับเกร็ดเล็กเกร็ดน้อย
jrhorn424

2
$ 0 ยังคงใช้งานได้สำหรับการอ้างอิงกลับทั้งนิพจน์ใน Sublime Text 2
sturrockad

2
$0คือการแข่งขัน regex ทั้งหมด $1เป็นกลุ่มการจับภาพแรก
Oletha

103

โดยวิธีการในคำถามข้างต้น:

สำหรับ:

Hello, my name is bob

ค้นหาส่วนหนึ่ง:

my name is (\w)+

ด้วยส่วนแทนที่:

my name used to be \1

จะกลับมา:

Hello, my name used to be b

เปลี่ยน find part เป็น:

my name is (\w+)

และแทนที่จะเป็นสิ่งที่คุณคาดหวัง:

Hello, my name used to be bob

ในขณะที่ (\ w) + จะตรงกับ "bob" ไม่ใช่การจัดกลุ่มที่คุณต้องการแทนที่


52

สำคัญ: ใช้( )วงเล็บในสตริงการค้นหาของคุณ

ในขณะที่คำตอบก่อนหน้านี้ถูกต้องมีสิ่งสำคัญที่จะต้องเน้นคือ! ทั้งหมดส่วนการจับคู่ในสายการค้นหาของคุณที่คุณต้องการใช้งานของคุณในสตริงทดแทนจะต้องล้อมรอบด้วย( )วงเล็บมิฉะนั้นกลุ่มจับคู่เหล่านี้จะไม่สามารถเข้าถึงตัวแปรที่กำหนดไว้เช่น$1, $2หรือ\1, \2ฯลฯ

ตัวอย่างเช่นเราต้องการแทนที่ 'em' ด้วย 'px' แต่เก็บค่าหลักไว้:

    margin: 10em;  /* Expected: margin: 10px */
    margin: 2em;   /* Expected: margin: 2px */
  • สตริงการแทนที่: margin: $1pxหรือmargin: \1px
  • สตริงการค้นหา (แก้ไข): margin: ([0-9]*)em// พร้อมวงเล็บ
  • ค้นหาสตริง (INCORRECT): margin: [0-9]*em

ตัวอย่างกรณีที่ถูกต้อง:การใช้margin: ([0-9]*)emสตริงการค้นหา (พร้อมวงเล็บ) ใส่ส่วนที่จับคู่ที่ต้องการ (เช่น$1หรือ\1) ด้วย( )วงเล็บดังนี้:

  • ค้นหา: margin: ([0-9]*)em(พร้อมวงเล็บ)
  • แทนที่เป็น: margin: $1pxหรือmargin: \1px
  • ผลลัพธ์:
    margin: 10px;
    margin: 2px;

ตัวอย่างกรณีที่ไม่ถูกต้อง:การใช้margin: [0-9]*emสตริงการค้นหา (ไม่มีวงเล็บ) รูปแบบ regex ต่อไปนี้จะตรงกับสายที่ต้องการ แต่ส่วนการจับคู่จะไม่สามารถใช้ได้ในสตริงแทนที่เป็นตัวแปรเช่น$1หรือ\1:

  • ค้นหา: margin: [0-9]*em(ไม่มีวงเล็บ)
  • แทนที่เป็น: margin: $1pxหรือmargin: \1px
  • ผลลัพธ์:
    margin: px; /* `$1` is undefined */
    margin: px; /* `$1` is undefined */

1
ขอบคุณคำตอบนี้ชี้ให้เห็นถึงข้อเท็จจริงที่น่าสนใจที่แก้ไขปัญหาของฉันได้
Enkk

ขอบคุณที่ชี้นำ ด้วย () ฉันสามารถแทนที่ด้วย \ 1 ใน Sublime 3
Jeffrey

47

นี่คือการนำเสนอภาพของคำตอบที่ได้รับอนุมัติ

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


ทำไมไม่หา$_SESSION[(\w+)? ขอบคุณ
Toni Michel Caubet

เนื่องจาก $, [, (และ) เป็นอักขระพิเศษดังนั้นคุณควรหลีกเลี่ยงอักขระพิเศษแต่ละตัวด้วยแบ็กสแลช
zeeawan

25

โปรดทราบว่าถ้าคุณใช้มากกว่า 9 ${10}กลุ่มการจับภาพที่คุณต้องใช้ไวยากรณ์

$10หรือ\10หรือ\{10}จะไม่ทำงาน


ขอบคุณ! สิ่งนี้มีประโยชน์สำหรับฉันในการแทนที่และเพิ่มหมายเลขที่ส่วนท้ายของกลุ่มที่ถูกจับเช่นเพื่อผนวก1กลุ่มการจับภาพที่สองที่คุณต้องใช้วงเล็บปีกกาเช่น${2}1; $ 21 หมายถึงกลุ่มการจับกุมที่ 21 ซึ่งไม่มีอยู่จริง
Eric

1

ดูบทความ Sublime Text เอกสารทางการทางการในการค้นหาและแทนที่ดูเหมือนว่า+(.+)เป็นกลุ่มจับภาพที่คุณอาจต้องการ ... แต่ฉันใช้ส่วนตัว(.*)และมันทำงานได้ดี หากต้องการแทนที่ในแบบที่คุณพูดคุณอาจชอบการสนทนานี้ในฟอรัมโดยเฉพาะโพสต์นี้ที่บอกว่าใช้$1เพื่อใช้กลุ่มแรกที่ถูกจับ

และเนื่องจากรูปภาพดีกว่าคำพูด ...

ก่อน: ก่อนค้นหา / แทนที่

หลังจาก: หลังจากค้นหา / แทนที่

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