regex เพื่อให้ตรงกับ EOF


92

ฉันมีข้อมูลบางอย่างที่มีลักษณะเช่นนี้

john, dave, chris
rick, sam, bob
joe, milt, paul

ฉันใช้ regex นี้เพื่อจับคู่ชื่อ

/(\w.+?)(\r\n|\n|,)/

ซึ่งได้ผลเป็นส่วนใหญ่ แต่ไฟล์จะจบลงทันทีหลังจากคำสุดท้ายซึ่งหมายความว่าค่าสุดท้ายไม่ได้ลงท้าย\r\nด้วย\nหรือ,ลงท้ายด้วย EOF มีวิธีจับคู่ EOF ใน regex เพื่อให้ฉันสามารถใส่ในการจัดกลุ่มที่สองนั้นได้ถูกต้องหรือไม่


คุณกำลังพยายามรวบรวมชื่อทั้งหมดในกลุ่มเดียวหรือกลุ่มการจับหนึ่งกลุ่มต่อชื่อ?
Andrew Hare

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

แค่ต้องการเพิ่มไซต์ทดสอบ regex ที่ยอดเยี่ยม: regexplanet.com/simple
northpole


@ ซีนัน - ฉันเห็นด้วย; ผสาน
Marc Gravell

คำตอบ:


163

คำตอบสำหรับคำถามนี้\Zต้องใช้เวลาพอสมควรในการคิดออก แต่ตอนนี้ใช้งานได้แล้ว โปรดทราบว่าในทางกลับกัน\Aจับคู่จุดเริ่มต้นของสตริงทั้งหมด (ตรงข้าม^และ$ตรงกับจุดเริ่มต้นของบรรทัดเดียว)


5
โปรดทราบว่าคุณอยู่หลังจาก fonctionality ใน netbeans สำหรับการค้นหาไฟล์โครงการเมื่อเทียบกับการค้นหาในไฟล์สิ่งต่อไปนี้จะทำงานแตกต่างกัน ... (\s*)\?>(\s*)\Z... และหลังจากการขุดเพิ่มเติมที่นี่คือสิ่งที่จะทำงานในโฟลเดอร์โครงการ : (\s*)\?>(\s*)(\n*)(\W)\Z FYI: นี่คือการแทนที่แท็ก php ที่ปิดทั้งหมดโดยการแบ่งบรรทัดที่ท้ายไฟล์
MediaVince

1
ปรากฎว่า\Aยังใช้งานได้ใน Visual Studio ค้นหาและแทนที่ เช่นเคยใช้สิ่งเหล่านี้ด้วยความระมัดระวัง แต่มันก็ช่วยให้ฉันไม่ต้องยุ่งเกี่ยวกับเรื่องนี้เมื่อฉันมีความสุขที่ได้ทำในสิ่งที่ถูกต้อง
Steve Pettifer

ในขณะที่ฉันใช้Scannerคลาสของ Java เพื่ออ่านไฟล์ทั้งหมดพร้อมกัน ถ้าฉันใช้\Zเป็นตัวคั่นอักขระขึ้นบรรทัดต่อท้ายจะถูกตัดออก เมื่อฉันเปลี่ยนตัวคั่นเป็น\zอักขระขึ้นบรรทัดต่อท้ายจะคงไว้ ดูเหมือนว่าคำตอบของ Martin Doreyก็ใช้ได้กับ Java เช่นกัน
mmdemirbas

24

EOF ไม่ใช่ตัวละครจริงๆ หากคุณมีสตริงหลายบรรทัด "$" จะจับคู่ส่วนท้ายของสตริงและท้ายบรรทัดด้วย

ใน Perl และพี่น้องของตน\Aและ\Zตรงกับจุดเริ่มต้นและจุดสิ้นสุดของสตริงทั้งหมดละเว้นเส้นแบ่ง

ส่วนขยาย GNU ไปยัง regexes POSIX ใช้\`และ\'สำหรับสิ่งเดียวกัน


18

ใน Visual Studio คุณสามารถหา EOF $(?![\r\n])ชอบโดย: วิธีนี้ใช้งานได้ว่าส่วนท้ายบรรทัดของคุณเป็น CR, CRLF หรือเพียงแค่ LF

ในฐานะโบนัสคุณสามารถมั่นใจได้ว่าไฟล์รหัสทั้งหมดของคุณมีเครื่องหมายขึ้นบรรทัดสุดท้ายดังนี้:

               Find What: (?<![\r\n])$(?![\r\n])
            Replace With: \r\n
 Use Regular Expressions: checked
Look at these file types: *.cs, *.cshtml, *.js

วิธีการทำงาน:

ค้นหาปลายบรรทัดใด ๆ (ตรงกับความกว้างเป็นศูนย์) ที่ไม่ได้นำหน้าด้วย CR หรือ LF และไม่ตามด้วย CR หรือ LF ความคิดบางอย่างจะแสดงให้คุณเห็นว่าทำไมถึงได้ผล!

โปรดทราบว่าคุณควรแทนที่ด้วยอักขระสิ้นสุดบรรทัดที่คุณต้องการไม่ว่าจะเป็น CR, LF หรือ CRLF


มีข้อบกพร่องใน Visual Studio 2019 ซึ่งการแทนที่ทั้งหมดด้วยสิ่งนี้อาจส่งผลให้มีการเพิ่มบรรทัดใหม่สองรายการที่ท้ายไฟล์ ฉันคิดว่ามันมีส่วนเกี่ยวข้องกับตัวเลือกการบันทึกบรรทัดใหม่อัตโนมัติ
Stevoisiak

10

เปรียบเทียบพฤติกรรมของ \ Z ที่แนะนำของ Ryan กับ \ z:

$ perl -we 'my $ corpus = "สวัสดี \ n"; $ corpus = ~ s / \ Z / โลก / g; พิมพ์ (": $ corpus: \ n") '
:สวัสดีชาวโลก
โลก:
$ perl -we 'my $ corpus = "สวัสดี \ n"; $ corpus = ~ s / \ z / world / g; พิมพ์ (": $ corpus: \ n") '
:สวัสดี
โลก:
$ 

perlre sez:

\ Z จับคู่เฉพาะที่ส่วนท้ายของสตริงหรือก่อนขึ้นบรรทัดใหม่ในตอนท้าย
\ z จับคู่เฉพาะที่ส่วนท้ายของสตริง

การแปลกรณีทดสอบเป็น Ruby (1.8.7, 1.9.2) จะทำงานเหมือนกัน


4

เมื่อเร็ว ๆ นี้ฉันกำลังมองหาสิ่งนี้ แต่สำหรับ JavaScript

วางไว้ตรงนี้เพื่อให้ทุกคนที่มีปัญหาเดียวกันได้รับประโยชน์

var matchEndOfInput = /$(?![\r\n])/gm;

โดยทั่วไปสิ่งนี้จะตรงกับจุดสิ้นสุดของบรรทัดซึ่งไม่ตามด้วยการกลับรถหรืออักขระขึ้นบรรทัดใหม่ โดยพื้นฐานแล้วสิ่งนี้เหมือนกับ\Zแต่สำหรับ JavaScript


2

ต้องจับเส้นคั่นจริงๆหรือ? ถ้าไม่ regex นี้ควรเป็นสิ่งที่คุณต้องการ:

/\w+/

สมมติว่าสตริงย่อยทั้งหมดที่คุณต้องการจับคู่ประกอบด้วยอักขระคำทั้งหมดเช่นในตัวอย่างของคุณ



1

สมมติว่าคุณใช้ตัวปรับแต่งที่เหมาะสมบังคับให้ปฏิบัติต่อสตริงโดยรวม (ไม่ใช่ทีละบรรทัด - และถ้า \ n เหมาะกับคุณคุณกำลังใช้มัน) เพียงเพิ่มทางเลือกอื่น - ท้ายสตริง: (\ r \ n | \ n |, | $)


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