นิพจน์ทั่วไปที่จะหยุดในนัดแรก


531

รูปแบบ regex ของฉันดูเหมือนอะไร

<xxxx location="file path/level1/level2" xxxx some="xxx">

ฉันสนใจเฉพาะในส่วนของเครื่องหมายคำพูดที่กำหนดให้กับสถานที่ มันไม่ง่ายอย่างนั้นถ้าไม่มีสวิตช์โลภ?

/.*location="(.*)".*/

ดูเหมือนจะไม่ทำงาน


แหล่งที่มาของคุณคืออะไรมันเป็น HTML หรือ xml หรืออะไรบางอย่าง?
Oskar Kjellin

20
ทำไมนี่เป็นวิกิชุมชน มันเป็นคำถามที่แท้จริง สายเกินไปแล้ว
Ahmad Mageed

1
คุณเขียนด้วยภาษาอะไร โปรดอย่าใช้ regex สำหรับ XML มีวิธีที่ดีกว่ามากมายในการแยกวิเคราะห์ XML
Oskar Kjellin

3
ไม่ใช่ถ้าสิ่งที่คุณต้องการคือการสแกนหาคุณสมบัติที่เรียบง่าย Regex เหมาะสมและเร็วขึ้น
codenheim

ฉันจะบอกว่าถ้าคุณเช่นรหัส c # จะดีกว่ามากที่จะใช้ linq นี้ ฉันสงสัยว่ามันจะดีกว่าถ้าคุณมีโปรแกรมแยกวิเคราะห์ที่ดี
Oskar Kjellin

คำตอบ:


1096

คุณต้องทำให้การแสดงออกปกติของคุณไม่โลภเพราะโดยปกติจะตรงกับทุก"(.*)""file path/level1/level2" xxx some="xxx"

แต่คุณสามารถทำให้จุดดาวไม่ใช่ความโลภซึ่งจะทำให้ตรงกับตัวละครน้อยที่สุด:

/location="(.*?)"/

เพิ่ม?ในปริมาณ A ( ?, *หรือ+) ทำให้มันไม่โลภ


32
FWIW, ใส่หีบห่อของคุณโดยใช้ VIM, regex นี้จะต้องแตกต่างกันเล็กน้อย: แทนที่จะ.*?เป็นการ.\{-}จับคู่ที่ไม่โลภ
SooDesuNe

44
ขอบคุณแดเนียล "การเพิ่ม? บน quantifier (?, * หรือ +) ทำให้มันไม่โลภ" เคล็ดลับที่เป็นประโยชน์สำหรับฉัน
PhatHV

10
การ อธิบายถึงความสับสนของฉันในการพยายามคิดออก เหมาะสมอย่างไร
Robbie Smith

1
ฉันเชื่อว่าคุณสามารถพูดว่า 'ขี้เกียจ' แทน 'ไม่โลภ'
Manticore

50

location="(.*)"จะจับคู่จาก "หลังจากlocation=จนถึง" หลังsome="xxxเว้นแต่คุณจะไม่โลภ ดังนั้นคุณอาจจำเป็นต้อง.*?(เช่นทำให้มันไม่โลภ) หรือดีกว่าแทนที่ด้วย.*[^"]*


3
[^ "] * อาจเร็วขึ้นด้วยเอ็นจิ้นส่วนใหญ่เพราะไม่จำเป็นต้องค้นหารูปแบบหลังจากรูปแบบปัจจุบัน
Jean Vincent

1
@ คิป: คุณอาจจะถูก แต่.*?สัญกรณ์ทั่วไปมากกว่า[^"]*
Bondax

แล้วถ้าฉันต้องการรวมอักขระตัวคั่นโดยใช้ [^ "] *
Frohlich

ไม่เลยถ้าคุณไม่รู้ว่า ^ และ [] หมายถึงอะไรที่นี่ คนส่วนใหญ่จะเข้าใจ *
Vincent Gerris

31

เกี่ยวกับ

.*location="([^"]*)".*

วิธีนี้จะหลีกเลี่ยงการค้นหาที่ไม่ จำกัด ด้วย. * และจะจับคู่กับเครื่องหมายคำพูดแรก


เนื่องจากความแตกต่างใน grepข้างต้นควรเป็นรูปแบบที่ต้องการหากพกพาเป็นกังวล
Josh Habdas

22

ใช้การจับคู่ที่ไม่โลภถ้าเครื่องยนต์ของคุณรองรับ เพิ่มหรือไม่ ภายในการจับภาพ

/location="(.*?)"/

11

การใช้ Lazy quantifiers ?โดยไม่มีการตั้งค่าสถานะเป็นคำตอบ

เช่น,

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

หากคุณมีการตั้งค่าสถานะทั่วโลก/gมันจะมีการจับคู่การแข่งขันความยาวต่ำสุดทั้งหมดดังต่อไปนี้ ป้อนคำอธิบายรูปภาพที่นี่


1

เพราะคุณกำลังใช้subpattern เชิงปริมาณและ descried ในPerl Doc ,

โดยค่าเริ่มต้นรูปแบบย่อยที่ถูกจัดอันดับคือ " โลภ " นั่นคือมันจะจับคู่หลาย ๆ ครั้งให้มากที่สุดเท่าที่จะเป็นไปได้ หากคุณต้องการ ให้ตรงกับจำนวนครั้งต่ำสุดที่เป็นไปได้ให้ปฏิบัติตามตัวบ่งชี้ ด้วย "?" . โปรดทราบว่าความหมายไม่เปลี่ยนแปลงเพียงแค่ "ความโลภ":

*?        //Match 0 or more times, not greedily (minimum matches)
+?        //Match 1 or more times, not greedily

ดังนั้นในการอนุญาตให้รูปแบบเชิงปริมาณของคุณทำการจับคู่ขั้นต่ำให้ทำตามโดย?:

/location="(.*?)"/

1

นี่คือวิธีอื่น

นี่คือสิ่งที่คุณต้องการ นี่มันขี้เกียจ[\s\S]*?

รายการแรก: [\s\S]*?(?:location="[^"]*")[\s\S]*แทนที่ด้วย:$1

คำอธิบาย : https://regex101.com/r/ZcqcUm/2


เพื่อความสมบูรณ์นี่จะเป็นอันสุดท้าย นี่เป็นโลภ[\s\S]*

รายการสุดท้าย:[\s\S]*(?:location="([^"]*)")[\s\S]* แทนที่ด้วย:$1

คำอธิบาย : https://regex101.com/r/LXSPDp/3


มีความแตกต่างเพียง 1 ข้อระหว่างนิพจน์ทั่วไปสองรายการนี้และนั่นคือ ?

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