Какой 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 ответов
Подходящим регулярным выражением будет символ ' 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:"
(.*?) Это второй записанный текст и означает все, что следует после
(?= |$) создают предел, который представляет собой пробел между = и |
Итак, для второй группы у вас будет значение