Regex ครั้งล่าสุด?


122

ฉันพยายามจับส่วนสุดท้ายหลังจากแบ็กสแลชสุดท้าย
ฉันต้องการ\Web_ERP_Assistant(ด้วยไฟล์\ )

ความคิดของฉันคือ:

C:\Projects\Ensure_Solution\Assistance\App_WebReferences\Web_ERP_WebService\Web_ERP_Assistant


\\.+?(?!\\)      //  I know there is something with negative look -ahead `(?!\\)`

แต่หาไม่เจอ.

[Regexer Demo]


2
ขอขอบคุณที่คำถามของคุณเกี่ยวข้องกับ regexes แต่คุณแน่ใจหรือไม่ว่านี่เป็นเครื่องมือที่ดีที่สุดที่จะใช้ที่นี่ ไลบรารีมาตรฐานส่วนใหญ่จะมีวิธีการที่จะดึงชื่อพา ธ สุดท้ายในไดเร็กทอรีที่กำหนด นอกจากนี้ยังคำนึงถึงสิ่งที่ตัวคั่นไดเร็กทอรีอยู่บนระบบปฏิบัติการที่กำหนด
Steve Rukuts

@Raskolnikov ฉันต้องการสิ่งนั้นใน regex ฉันรู้จัก Pth.getFileNameWithoutExtension คำถามถูกแท็กเป็น regex
Royi Namir

2
โอเคยุติธรรมเพียงพอแค่ตรวจสอบให้แน่ใจ ฉันจะปล่อยให้คนที่มีทักษะใน regexes มากกว่านี้
Steve Rukuts

คำตอบ:


95

วิธีแก้ปัญหาเชิงลบของคุณจะเป็นดังนี้:

\\(?:.(?!\\))+$

ดูได้ที่นี่ใน Regexr


2
(?:เป็นจุดเริ่มต้นของกลุ่มที่จับไม่ใช่ .เป็นตัวละครใด ๆ การตรวจสอบนี้ตัวอักษรใด ๆ ถ้าไม่ได้ตามมาด้วย ``
stema

Multi line ใช้สำหรับการทดสอบ Regexr ที่จำเป็นเท่านั้น มันเปลี่ยนความหมายของไฟล์$. Standard คือจุดสิ้นสุดของสตริงโดยมี Multiline อยู่ท้ายแถว เนื่องจากข้อความทดสอบใน Regexr มีหลายแถวฉันจึงต้องการตัวเลือกนี้ที่นั่น
stema

จะเกิดอะไรขึ้นถ้าฉันต้องการคำถามเดียวกันกับคำถามเดิมของฉัน แต่ไม่มี \ ในตอนเริ่มต้น?
Royi Namir

2
(?:[^\\/](?!(\\|/)))+$ลบเครื่องหมายทับที่จุดเริ่มต้นและจัดการด้วยเครื่องหมายทับทั้งไปข้างหน้าและข้างหลัง นอกจากนี้ยังจับคู่สตริงทั้งหมดสำหรับแพทช์
mrswadge

5
ในนิรภัยโลภ Token จุดควรมาหลังจาก lookahead (?:(?!\\).)+นี้: ( อ้างอิง ) นอกจากนี้ตัวอย่างของคุณใน RegExr ยังใช้แบ็กสแลชสองตัวเพื่อแยกส่วนประกอบพา ธ ควรมีเพียงรายการเดียวและ regex ควรจับคู่เพียงรายการเดียว ( สาธิต )
Alan Moore

62

สิ่งที่เหมาะกับฉันคือ:

.+(\\.+)$

ลองออนไลน์!

คำอธิบาย:

.+     - any character except newline
(      - create a group
 \\.+   - match a backslash, and any characters after it
)      - end group
$      - this all has to happen at the end of the string

16
ขอบคุณสำหรับการแยกส่วน :)
Jason Bruce

1
ฉันกำลังมองหานิพจน์ทั่วไปที่ตรงกับเครื่องหมายทับ (/) ตัวสุดท้าย ปรากฎว่าคำตอบที่ได้รับการยอมรับข้างต้นโดย @stema ทำงานเมื่อแบ็กสแลชถูกแทนที่ด้วยเครื่องหมายทับ ของคุณตรงกับทุกสิ่งหลังจากเฉือนทุกอย่างซึ่งจริงๆแล้วไม่ใช่วิธีแก้ปัญหา ฉันยกระดับคำตอบของคุณเพราะคำอธิบายของคุณเป็นความจำนนแม้ว่าโซลูชันของคุณจะไม่ได้ผล
ก็ตาม

สิ่งนี้ง่ายกว่ามากและโดยทั่วไปดีกว่าการมองเชิงลบตราบใดที่มันไม่ถูกขัดจังหวะบนบรรทัดทำไมต้องซับซ้อนเกินไป?
Scott Anderson

42

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

(\\)(?!.*\\)

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


4
นี้ตรงกับทับขวาที่ผ่านมาเท่านั้น OP ต้องการจับคู่ทุกอย่างหลังจากนั้นเช่นกัน
Alan Moore

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

28

\\[^\\]*$คุณสามารถลองทอดสมอไปยังจุดสิ้นสุดของสตริงบางอย่างเช่น แม้ว่าฉันจะไม่แน่ใจว่าต้องใช้ regexp สำหรับงานหรือไม่


2
สิ่งนี้ได้ผลดีสำหรับฉัน ([^\/]*)$ตรงกับชื่อไฟล์ในพา ธ สำหรับกล่อง Linux คุณสามารถอธิบายวิธีการ^ทำงานของคาเร็ตในบริบทนี้ได้หรือไม่? ฉันเคยใช้มันเพื่อบ่งบอกจุดเริ่มต้นของสตริงเท่านั้น
Brad

@ แบรดมันเป็นการปฏิเสธ ความหมาย[^\/]ตรงกับตัวอักษรใด ๆ /ยกเว้น
Michael Krelin - แฮ็กเกอร์

9

regex นี้มีอะไรบ้าง: \\[^\\]+$


ฉันไม่คิดว่าจะต้องอยู่ใน regex แต่ฉันจะแก้ไขคำตอบของฉัน
SERPRO

เอ่อ ... ฉันไม่คิดว่ามันควรจะเป็น regex เลย แต่สำหรับการจับคู่ที่จะรวมมันก็ควรจะเป็นเช่นนั้นไม่ใช่เรื่องสำคัญฉันเพิ่งคิดว่าจะมีอะไรผิดพลาดเกี่ยวกับคำตอบของคุณหลังจากเห็นมัน ถูกลดคะแนนและนี่คือสิ่งที่ฉันคิดขึ้นมาดังนั้นฉันจึงแสดงความคิดเห็น
Michael Krelin - แฮ็กเกอร์

@ ไมเคิลอย่าเข้าใจฉันผิดฉันขอขอบคุณสำหรับความคิดเห็นของคุณฉันแค่คิดว่าไม่จำเป็นต้องเพิ่มใน regex the \;)
SERPRO

5

หากคุณไม่ต้องการรวมแบ็กสแลช แต่มีเพียงข้อความที่อยู่ข้างหลังให้ลองทำสิ่งนี้: ([^\\]+)$หรือสำหรับยูนิกซ์:([^\/]+)$


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