ฉันจะใช้ Regex เพื่อจับคู่ทุกเหตุการณ์ของสตริงระหว่างสองสตริงที่อยู่รอบ ๆ โดยไม่รวมสตริงที่อยู่รอบ ๆ ได้อย่างไร

ฉันกำลังดิ้นรนกับ regex นี่คือคำสั่งที่ฉันใช้ (เรียกใช้ Cygwin บน Windows) ตามคำแนะนำของ hwnd (ซึ่งได้แก้ไขปัญหาก่อนหน้าของฉันแล้ว):

grep -Po '(?<="id":)[^,]+' regex_test.txt

ฉันจะเปลี่ยนนิพจน์ทั่วไปเพื่อให้การจับคู่ที่สร้างขึ้นเริ่มต้นด้วย ,{id: OR :[{id: ? น่าเศร้าที่นิพจน์ปัจจุบันยังจับ ID ที่ไม่ต้องการซึ่งขึ้นต้นด้วย :{id:

ไฟล์ข้อความอินพุตชื่อ regex_test.txt:

เหตุผล:{id:25549177,“รูปแบบ:null},iphone:[{id:2411977008,version:null},{id:2430057923,

เอาท์พุท:

25549177

2411977008

2430057923

ผลลัพธ์ที่ต้องการ:

2411977008

2430057923

โปรดแจ้งให้เราทราบความคิดเห็นของคุณเกี่ยวกับปัญหาเหล่านี้


person Sonia    schedule 12.04.2015    source แหล่งที่มา
comment
@ Сухой27 คำถามนี้ดูเหมือนจะไม่ซ้ำกัน: มันเกี่ยวกับ [pcre] และ [grep] ! (การใช้เชลล์ไม่ใช่ Perl) ตามที่ฉันเข้าใจ นอกจากนี้ lookaround ยังเป็นคุณลักษณะที่น่าสนใจที่ไม่แสดงในลิงก์ที่มีจุดประสงค์เพื่อแกล้งทำเป็นซ้ำ   -  person F. Hauri    schedule 12.04.2015


คำตอบ (1)


คุณสามารถใช้การยืนยัน Positive Lookbehind ( ดังที่แสดงใน คำตอบ ):

grep -Po '(?<="id":)[^,]+' regex_test.txt

สาธิตไอเดียไอดี

person hwnd    schedule 12.04.2015
comment
@hwnd มีปัญหาเพิ่มเติมที่ฉันพบอยู่ ฉันจะเปลี่ยนนิพจน์ทั่วไปของคุณได้อย่างไรเพื่อให้การจับคู่ที่สร้างขึ้นเริ่มต้นด้วย ,{id: OR :[{id: (เงื่อนไขที่เฉพาะเจาะจงมากกว่า “ ปัจจุบัน id”: ? น่าเศร้าที่นิพจน์ปัจจุบันยังจับ ID ที่ไม่ต้องการซึ่งขึ้นต้นด้วย :{id: - person Sonia; 13.04.2015
comment
@โซเนีย ลอง (?<=[[,]{"id":)[^,]+ - person hwnd; 13.04.2015
comment
@hwnd นั่นเป็นกลอุบาย ฉันกำลังพยายามหลบหนีอักขระ [ { ขอบคุณ! - person Sonia; 13.04.2015