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


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

некоторые строки имеют две кавычки, но мне нужно получить все из первого экземпляра 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
6 75

6 ответов:

'.*

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

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

'.*$

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

(?<=').*$

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

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

'.* 

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

'.*$

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

когда я пытался '.* в windows (Notepad ++) он будет соответствовать всему после первого ' до конца последней строки.

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

'.*?\n

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

это будет захватывать все до "в backreference 1-и все после" в backreference 2. Возможно, вам придется избежать апострофов, хотя в зависимости от языка (\')

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

быстрая модификация: если линия не имеет ' - backreference 1 все равно должен поймать всю линию.

^ - start of string
([^']*) - capture any number of not ' characters
'? - match the ' 0 or 1 time
(.*) - capture any number of characters
$ - end of string

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

'([^\n]+)$

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

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

'[^\n]+\n

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

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

'[^$]+$