Regex ใดที่จะจับทุกอย่างตั้งแต่เครื่องหมาย 'ไปจนถึงจุดสิ้นสุดของบรรทัด?


123

ฉันมีไฟล์ข้อความที่แสดงถึงข้อสังเกตด้วยไฟล์'.

บางบรรทัดมีเครื่องหมายคำพูดสองคำ แต่ฉันต้องการรับทุกอย่างตั้งแต่ตัวอย่างแรกของ a 'และฟีดบรรทัด

I AL01                  ' A-LINE                            '091398 GDK 33394178    
         402922 0831850 '                                   '091398 GDK 33394179    
I AL02                  ' A-LINE                            '091398 GDK 33394180    
         400722 0833118 '                                   '091398 GDK 33394181    
I A10A                  ' A-LINE 102                       '  53198 DJ  33394182    
         395335 0832203 '                                  '  53198 DJ  33394183    
I A10B                  ' A-LINE 102                       '  53198 DJ  3339418

คำตอบ:


171
'.*

ฉันเชื่อว่าคุณต้องการตัวเลือก Multiline


3
สิ่งนี้จะจับภาพตัวอย่างแรกของตัวละครและจุดสิ้นสุดของบรรทัดสุดท้าย
killdaclick

90

regex ที่เหมาะสมจะเป็น "char ตามด้วยจำนวนอักขระใด ๆ [รวมถึงอักขระศูนย์] ที่ลงท้ายด้วยโทเค็นสตริง / บรรทัด:

'.*$

และหากคุณต้องการจับภาพทุกอย่างหลังจาก 'char แต่ไม่รวมไว้ในเอาต์พุตคุณจะใช้:

(?<=').*$

โดยพื้นฐานแล้วนี่บอกว่าให้ฉันอักขระทั้งหมดที่ตามหลัง 'char จนถึงท้ายบรรทัด

แก้ไข : มีการตั้งข้อสังเกตว่า $ เป็นนัยเมื่อใช้ * ดังนั้นจึงไม่จำเป็นต้องใช้อย่างเคร่งครัดดังนั้นรูปแบบ:

'.* 

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


1
$ นั้นไม่จำเป็น จุดจะหยุดที่ท้ายบรรทัดภายใต้สถานการณ์ปกติ
Tomalak

7
ไม่จำเป็น - แต่เหมาะสมกับสิ่งที่เขาต้องการทำ มันทำหน้าที่เป็นตัวเตือนในภายหลังว่าคาดหวังทุกอย่างตั้งแต่ 'ถึงท้ายบรรทัด
gnarf

@balabaster: ฉันไม่ได้บอกว่ามันผิด ;-) มันเป็นแค่เชิงอรรถ
Tomalak

@Tomalak: ไม่ได้พยายามบอกเป็นนัยว่าคุณผิดไม่ว่าด้วยวิธีใด ๆ เพียงแค่ชี้แจงเหตุผลของฉันสำหรับการเลือกใช้ $ แทนที่จะไม่ใช้ ขอบคุณที่ชี้ให้ดู
BenAlabaster

+1 สำหรับการรวมทุกอย่างไว้หลังตัวละครที่เป็นปัญหาแทนที่จะรวมไว้เสมอ
grizzasd

22
'.*$

เริ่มต้นด้วยเครื่องหมายคำพูดเดียว ( ') จับคู่อักขระใด ๆ ( .) ศูนย์หรือมากกว่าครั้ง ( *) จนถึงจุดสิ้นสุดของบรรทัด ( $)


คำตอบนี้เป็นตัวอย่างที่ดีในการแยกตรรกะเบื้องหลังคำสั่งว่าอย่างไรดีและชัดเจน!
Timmah

12

เมื่อฉันลอง '. * ใน windows (Notepad ++) มันจะจับคู่ทุกอย่างหลังจากแรก' จนถึงท้ายบรรทัดสุดท้าย

ในการจับภาพทุกอย่างจนจบบรรทัดนั้นฉันพิมพ์สิ่งต่อไปนี้:

'.*?\n

สิ่งนี้จะจับทุกอย่างตั้งแต่ "จนจบบรรทัดนั้นเท่านั้น


6

ในตัวอย่างของคุณฉันจะใช้รูปแบบต่อไปนี้:

'([^\n]+)$

ใช้ตัวเลือกหลายสายและทั่วโลกเพื่อจับคู่เหตุการณ์ทั้งหมด

ในการรวม linefeed ในการแข่งขันคุณสามารถใช้:

'[^\n]+\n

แต่อาจพลาดบรรทัดสุดท้ายหากไม่มีตัวป้อนบรรทัด

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

'[^$]+$

4

สิ่งนี้จะจับทุกอย่างจนถึง 'in backreference 1 - และทุกอย่างตามหลัง' in backreference 2 คุณอาจต้องออกจากเครื่องหมายอะพอสทรอฟีแม้ว่าจะขึ้นอยู่กับภาษา (\ ')

/^([^']*)'?(.*)$/

การแก้ไขด่วน: ถ้าบรรทัดไม่มี '- backreference 1 ควรจะยังคงจับทั้งบรรทัด

^ - start of string
([^']*) - capture any number of not ' characters
'? - match the ' 0 or 1 time
(.*) - capture any number of characters
$ - end of string

0

https://regex101.com/r/Jjc2xR/1

/(\w*\(Hex\): w*)(.*?)(?= |$)/gm

ฉันแน่ใจว่ามันใช้งานได้มันจะจับอนุกรมเดเฮกซาในข้อความที่มีโครงสร้างไม่ดีหลายเสียงร้อง

     Space Reservation: disabled
         Serial Number: wCVt1]IlvQWv
   Serial Number (Hex): 77435674315d496c76515776
               Comment: new comment

ฉันเป็นมือใหม่นิรันดร์ใน regex แต่ฉันจะพยายามอธิบายอันนี้

(\ w * (Hex): w *): ค้นหาข้อความในบรรทัดที่สตริงมี "Hex:"

(. *?) นี่คือข้อความที่จับครั้งที่สองและหมายถึงทุกอย่างหลังจากนั้น

(? = | $) สร้างขีด จำกัด ที่มีช่องว่างระหว่าง = และ |

ดังนั้นกับกลุ่มที่สองคุณจะมีค่า


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