Який Regex захопив би все, від позначки до кінця рядка?


122

У мене є текстовий файл, який позначає зауваження одним '.

У деяких рядках є дві лапки, але мені потрібно отримати все з першого примірника 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

Відповіді:



90

Відповідним регулярним виразом буде «char», за яким слідує будь-яка кількість символів (включаючи нульові символи), що закінчується кінцем символу рядка / рядка:

'.*$

І якби ви хотіли зафіксувати все після знака "char", але не включити його у висновок, ви використовуєте:

(?<=').*$

Це в основному говорить, дайте мені всі символи, які дотримуються знака "до кінця рядка".

Редагувати : Було помічено, що $ є неявним при використанні. *, А тому не є строго необхідним, тому шаблон:

'.* 

технічно правильно, проте чіткіше бути конкретним і уникати плутанини для подальшого обслуговування коду, отже, моє використання $. Я вважаю, що завжди краще заявляти про явну поведінку, ніж покладатися на неявну поведінку в ситуаціях, коли ясність може бути поставлена ​​під сумнів.


1
$ Зайвий. Крапка зупиниться в кінці рядка за звичайних обставин.
Томалак

7
непотрібне - але належне для того, що він хоче зробити. Це нагадує пізніше, що він очікує всього від "до кінця рядка
gnarf

@balabaster: Я не сказав, що це неправильно. ;-) Це була лише виноска.
Томалак

@Tomalak: Я не намагався натякнути на те, що ви помилялися будь-якими способами, просто роз'яснював мої міркування щодо мого вибору використання $, а не ні. Дякую, що вказали на це.
BenAlabaster

+1 для того, щоб включити, як включити все після відповідного персонажа, а не завжди включати його.
grizzasd

22
'.*$

Починаючи з однієї лапки ( '), підберіть будь-який символ ( .) нуль або більше разів ( *) до кінця рядка ( $).


Ця відповідь - чудовий приклад того, як можна розбити логіку, яка є командою, приємною та зрозумілою!
Тімма

12

Коли я спробував ". * У windows (Notepad ++), він би відповідав усім після першого" до кінця останнього рядка.

Щоб захопити все до кінця цього рядка, я набрав наступне:

'.*?\n

Це зафіксувало б лише все від "до кінця цього рядка".


6

У вашому прикладі я б ішов за такою схемою:

'([^\n]+)$

використовувати багатолінійні та глобальні варіанти, щоб відповідати всім випадкам.

Щоб включити подачу ліній у поєдинок, ви можете використовувати:

'[^\n]+\n

Але це може пропустити останній рядок, якщо він не має передачі рядків.

Для одного рядка, якщо вам не потрібно збігатись із передачею рядків, я вважаю за краще використовувати:

'[^$]+$

4

Це зафіксує все до "в зворотному відношенні 1 - і все після" у зворотній референції 2. Можливо, вам потрібно буде уникнути апострофів, хоча залежно від мови (\ ')

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

Швидка модифікація: якщо в рядку немає '- зворотний вигляд 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

Я вічний новачок в регексе, але спробую пояснити це

(\ w * (Hex): w *): Знайдіть текст у рядку, де рядок містить "Hex:"

(. *?) Це другий захоплений текст і означає все після

(? = | $) створити межу, яка є пробілом між = і |

Так що з другою групою ви матимете значення


Це не питання, чи не так?
Даніель Е.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.