Какой Regex будет захватывать все, начиная от знака и до конца строки?

У меня есть текстовый файл, который обозначает замечания с одним ',

Некоторые строки имеют две кавычки, но мне нужно получить все из первого экземпляра ' и перевод строки.

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

6 ответов

Решение
'.*

Я считаю, что вам нужен вариант, Multiline.

Подходящим регулярным выражением будет символ ' char, за которым следует любое число любых символов [включая нулевые символы], оканчивающихся на конец токена строки / строки:

'.*$

И если вы хотите захватить все после символа char, но не включить его в вывод, вы должны использовать:

(?<=').*$

Это в основном говорит, дайте мне все символы, которые следуют за символом до конца строки.

Изменить: было отмечено, что $ неявно при использовании.* И, следовательно, не является строго обязательным, поэтому шаблон:

'.* 

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

'.*$

Начиная с одинарной цитаты ('), сопоставьте любой символ (.) ноль или более раз (*) до конца строки ($).

Когда я пытался ".* В Windows (Notepad ++), он будет соответствовать все после первого" до конца последней строки.

Чтобы захватить все до конца этой строки, я набрал следующее:

'.*?\n

Это только захватило бы все от 'до конца этой линии.

В вашем примере я бы пошел по следующей схеме:

'([^\n]+)$

использовать многострочные и глобальные параметры, чтобы соответствовать всем вхождениям.

Чтобы включить перевод строки в совпадении, вы можете использовать:

'[^\n]+\n

Но это может пропустить последнюю строку, если у нее нет перевода строки.

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

'[^$]+$

Это будет захватывать все до "в обратной ссылке 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

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:"

(.*?) Это второй записанный текст и означает все, что следует после

(?= |$) создают предел, который представляет собой пробел между = и |

Итак, для второй группы у вас будет значение

Другие вопросы по тегам