Regex apa yang akan menangkap segala sesuatu mulai dari 'mark hingga akhir baris?


123

Saya memiliki file teks yang menunjukkan komentar dengan satu '.

Beberapa baris memiliki dua tanda kutip tetapi saya perlu mendapatkan semuanya dari contoh pertama 'dan umpan baris.

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

Jawaban:



90

Regex yang sesuai adalah 'char yang diikuti dengan sejumlah karakter apa pun [termasuk karakter nol] yang diakhiri dengan tanda akhir string / baris:

'.*$

Dan jika Anda ingin menangkap semuanya setelah 'char tetapi tidak memasukkannya ke dalam output, Anda akan menggunakan:

(?<=').*$

Ini pada dasarnya mengatakan beri saya semua karakter yang mengikuti 'karakter sampai akhir baris.

Edit : Telah dicatat bahwa $ implisit saat menggunakan. * Dan oleh karena itu tidak diperlukan secara ketat, oleh karena itu polanya:

'.* 

secara teknis benar, namun lebih jelas untuk lebih spesifik dan menghindari kebingungan untuk pemeliharaan kode nanti, oleh karena itu saya menggunakan $. Ini adalah keyakinan saya bahwa selalu lebih baik untuk menyatakan perilaku eksplisit daripada mengandalkan perilaku implisit dalam situasi di mana kejelasan dapat dipertanyakan.


1
$ Tidak perlu. Titik tersebut akan berhenti di ujung garis dalam keadaan normal.
Tomalak

7
tidak perlu - tetapi tepat untuk apa yang ingin dia lakukan. Ini berfungsi sebagai pengingat nanti bahwa ia mengharapkan segalanya dari 'hingga akhir baris
gnarf

@ balabaster: Saya tidak mengatakan bahwa itu salah. ;-) Itu hanya catatan kaki.
Tomalak

@Tomalak: Tidak mencoba menyiratkan bahwa Anda salah dengan cara apa pun, kami hanya mengklarifikasi alasan saya untuk pilihan saya menggunakan $ daripada tidak. terimakasih telah menunjukkan itu.
BenAlabaster

+1 untuk menyertakan cara memasukkan semuanya setelah karakter yang dimaksud, daripada selalu menyertakannya.
grizzasd

22
'.*$

Dimulai dengan satu tanda kutip ( '), cocokkan karakter apa pun ( .) nol kali atau lebih ( *) hingga akhir baris ( $).


Jawaban ini adalah contoh yang bagus tentang bagaimana memecah logika di balik perintah apa, bagus dan jelas!
Timmah

12

Ketika saya mencoba '. * Di windows (Notepad ++) itu akan cocok dengan semuanya setelah pertama' sampai akhir baris terakhir.

Untuk menangkap semuanya sampai akhir baris itu saya mengetik yang berikut:

'.*?\n

Ini hanya akan menangkap semuanya dari 'sampai akhir baris itu.


6

Dalam contoh Anda, saya akan menggunakan pola berikut:

'([^\n]+)$

gunakan opsi multiline dan global untuk mencocokkan semua kejadian.

Untuk memasukkan linefeed dalam pertandingan, Anda bisa menggunakan:

'[^\n]+\n

Tapi ini mungkin melewatkan baris terakhir jika tidak memiliki linefeed.

Untuk satu baris, jika Anda tidak perlu mencocokkan linefeed, saya lebih suka menggunakan:

'[^$]+$

4

Ini akan menangkap semuanya hingga 'di referensi latar 1 - dan semuanya setelah' di referensi belakang 2. Anda mungkin perlu keluar dari apostrof meskipun bergantung pada bahasa (\ ')

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

Modifikasi cepat: jika baris tidak memiliki '- backreference 1 tetap harus menangkap keseluruhan baris.

^ - 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

Saya yakin yang ini berfungsi, ini akan menangkap serial de hexa dalam teks berstruktur buruk yang beraneka ragam di bawah

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

Saya seorang pemula abadi di regex tapi saya akan mencoba menjelaskan yang ini

(\ w * (Hex): w *): Temukan teks di baris di mana string berisi "Hex:"

(. *?) Ini adalah teks yang diambil kedua dan berarti segalanya setelahnya

(? = | $) buat batas yaitu spasi antara = dan |

Jadi dengan kelompok kedua, Anda akan mendapatkan nilainya


Bukan itu pertanyaannya, bukan?
Daniel E.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.