วิธีบุ๊กมาร์กเฉพาะครั้งแรกของผลลัพธ์การค้นหาหลายรายการเท่านั้น


1

ฉันค่อนข้างใหม่สำหรับ regex และฉันขอขอบคุณแนวทางบางอย่าง
ฉันมีไฟล์ข้อความค่อนข้างใหญ่และฉันต้องการคั่นบรรทัดคำหลักของฉัน แต่มีเพียงอินสแตนซ์แรกของพวกเขา

ตัวอย่างเช่น:


แอปเปิ้ลอร่อย
ฉันชอบเต่า.
เขาสูง.
เธอสวย.
ตกนรก!
เต่าฉลาด
นี่คืออาคารที่สวยที่สุดในโลก
แอปเปิ้ลดีต่อสุขภาพของคุณ
ธงฮังการีเป็นธงสามสีในแนวนอนมีสีแดงสีขาวและสีเขียว
เต่าเป็นสัตว์เลื้อยคลาน
คุณฉลาดมาก.
ภาษาฮังการีเป็นภาษาที่ยาก
กล้วยและแอปเปิ้ลมักจะราคาถูก


หากฉันสร้าง regex (apple | turtle | Hungarian) ฉันจะได้รับ 8 คั่นหน้าบรรทัด แต่ในตัวอย่างที่กล่าวถึงข้างต้นฉันต้องการเพียงครั้งแรกที่เกิดขึ้นดังนั้นฉันต้องการคั่นเฉพาะประโยคต่อไปนี้:

  • แอปเปิ้ลอร่อย
  • ฉันชอบเต่า.
  • ธงฮังการีเป็นธงสามสีในแนวนอนมีสีแดงสีขาวและสีเขียว

มีวิธีทำเช่นนี้หรือไม่?

ขอบคุณล่วงหน้า.


ใช้คุณสมบัติบุ๊กมาร์กในผลการค้นหา
DavidPostill

บางทีฉันอาจเข้าใจผิดความคิดเห็นของคุณ แต่ฉันไม่แน่ใจว่าคำแนะนำของคุณคืออะไร ฉันใช้คุณสมบัติบุ๊คมาร์ค ปัญหาของฉันคือฉันต้องการผลลัพธ์แรกเท่านั้น ข้อความของฉันมี 80-90000 บรรทัดและฉันมีคำหลักมากกว่า 100 คำการทำสิ่งนี้ด้วยตนเองไม่ใช่ตัวเลือกที่น่าเศร้า
Viktoria Ontapado

คำตอบ:


0

คำถามที่ดีฉันต้องไปและเรียนรู้เทคนิคใหม่ ๆ ของ Regex เพื่อให้ได้คำตอบ :)
ฉันไม่คิดว่าจะมีวิธีแก้ปัญหานี้ในเพียงคำสั่ง regex เดียวสำหรับทุกคำของคุณในเวลาเดียวกัน คำตอบของฉันอยู่ที่คำต่อคำ สำหรับคำหลัก 100 คำ ... ยังคงสามารถจัดการได้

ดังนั้นนี่คือ

\A^.*?(?<!apple).*?\Kapple

ให้ฉันทำลายมันลง ...

เรากำลังมองหาแอปเปิ้ลปรากฏตัวครั้งแรก

apple

แต่ถ้าไม่มีคำว่า apple อยู่ข้างหน้าเราจึงต้องใช้คุณสมบัติNegative Lookbehind

(?<!apple)apple

แต่อาจมีตัวละครอื่น ๆ และมีการขึ้นบรรทัดใหม่ในระหว่างนั้นดังนั้นให้เลือกตัวเลือก ". จับคู่ขึ้นบรรทัดใหม่" และใช้:

(?<!apple).*?apple

. * ต้องไม่โลภฉันไม่แน่ใจว่าทำไม ... :)

ใหม่เนื่องจากปัญหานี้ (ฉันต้องไปขอให้แก้ไขก่อน)) เราต้องยึด regex ของเราไว้ที่ตำแหน่งเริ่มต้นของไฟล์:

\A^(?<!apple).*?apple

\ A คือ " การเริ่มต้นถาวรของสตริง " ใน notepad ++ มันตรงกับจุดเริ่มต้นของไฟล์
เราต้องเพิ่ม ^ เพื่อยึดมันไว้ที่บรรทัดแรกของไฟล์

แน่นอนว่าอาจมีตัวละครอยู่ในระหว่างการเริ่มต้นของไฟล์และการเกิดขึ้นครั้งแรกของแอปเปิ้ลดังนั้น

\A^.*?(?<!apple).*?apple

และเราสนใจเฉพาะตำแหน่งที่ตั้งของแอปเปิลเท่านั้นไม่ใช่รูปแบบทั้งหมดดังนั้นเราจึงใช้ \ K เพื่อทำให้ข้อความตรงกันมากที่สุดจากการแข่งขัน Regex โดยรวม

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