Какое регулярное выражение захватило бы все от знака до конца строки?

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
user38349
источник

Ответы:

171
'.*

Я считаю, что вам нужна опция Multiline.

Джошуа Белден
источник
3
Это захватит первый экземпляр символа 'и конец последней строки
killdaclick
90

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

'.*$

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

(?<=').*$

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

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

'.* 

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

BenAlabaster
источник
1
Знак $ не нужен. В нормальных условиях точка остановится в конце строки.
Tomalak
7
ненужное, но подходящее для того, что он хочет делать. Позже он станет напоминанием о том, что ожидает всего от «до конца линии»
gnarf
@balabaster: Я не говорил, что это неправильно. ;-) Это была просто сноска.
Tomalak
@Tomalak: Я ни в коем случае не пытался намекнуть, что вы ошибались, просто разъяснял, почему я решил использовать $, а не нет. Спасибо, что указали на это.
BenAlabaster
+1 за включение того, как включать все после рассматриваемого символа, вместо того, чтобы всегда включать его.
grizzasd 07
22
'.*$

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

Джин Готимер
источник
Этот ответ - отличный пример того, как разбить логику, лежащую в основе этой команды, красиво и ясно!
Timmah
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
gnarf
источник
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:"

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

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

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

Ксавий Пупус
источник
Не в этом ли вопрос?
Дэниел Э.