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

У меня есть пример входного файла следующим образом: идентификатор столбца, имя, дата начала, дата окончания, возраст, описание, местоположение

220;John;23/11/2008;22/12/2008;28;Working as a Professor in University;Hyderabad
221;Paul;30;23/11/2008;22/12/2008;He is a Software engineer at MNC;Bangalore
222;Emma;23/11/2008;22/12/200825;Working as a mechanical enginner;Chennai

Он содержит 30 строк данных. Мое требование состоит в том, чтобы извлекать описания только из текстового файла выше.

Мой вывод должен содержать

Работа профессором в университете

Он инженер-программист в MNC.

работает инженером-механиком

Мне нужно найти регулярное выражение для извлечения описания, и я пробовал много видов, но не смог найти решение. Какие-либо предложения?


person mahodaya    schedule 19.02.2013    source источник
comment
разделитель в приведенном выше входном файле ;   -  person mahodaya    schedule 19.02.2013
comment
Возможно, я напутал в своем редактировании, вы имели в виду, что там есть точки с запятой и запятые?   -  person Lance Roberts    schedule 19.02.2013
comment
Хорошо, отредактируйте вместе с ними. Извините, я слишком много думаю о базах данных.   -  person Lance Roberts    schedule 19.02.2013
comment
Зачем вам регулярное выражение? Просто разделите точку с запятой и возьмите 4-й столбец, и все готово. Кроме того, вы должны указать, какой язык вы используете.   -  person Lone Shepherd    schedule 19.02.2013
comment
мое требование - использовать регулярное выражение......   -  person mahodaya    schedule 19.02.2013
comment
ты имеешь в виду домашнее задание?   -  person Lone Shepherd    schedule 19.02.2013
comment
аннотированный язык запросов aql   -  person mahodaya    schedule 19.02.2013
comment
Данные в беспорядке. У Джона две даты, а затем число (возраст); У Павла есть число и две даты; У Эммы есть дата, и дата смята вместе с номером. Перечисленные столбцы не включают ни один из столбцов даты. (Кто-то не может написать «инженер» или «Бангалор»). Как регулярное выражение узнает, что нужно преобразовать Working в working? Это ужасно неудобно!   -  person Jonathan Leffler    schedule 20.02.2013
comment
извините за мой английский, он работает, не работает на выходе.   -  person mahodaya    schedule 20.02.2013


Ответы (4)


Вы можете использовать это регулярное выражение

[^;]+(?=;[^;]*$)

[^;] соответствует любому символу, кроме ;

+ — это квантификатор, который многократно соответствует предыдущему символу или группе 1.

* — это квантификатор, который многократно соответствует предыдущему символу или группе 0.

$ это конец строки

(?=pattern) — это просмотр вперед, который проверяет, встречается ли определенный шаблон впереди

person Anirudha    schedule 19.02.2013

/^(?:[^;]+;){3}([^;]+)/ захватит 4-ю группу между точками с запятой.

Хотя, как указано в моем комментарии, вы должны просто разделить строку точкой с запятой и захватить 4-й элемент разделения... в этом весь смысл файла с разделителями, вам не нужно сложное сопоставление с образцом.

Пример реализации в Perl с использованием вашего примера ввода:

open(my $IN, "<input.txt") or die $!;

while(<$IN>){
    (my $desc) = $_ =~ /^(?:[^;]+;){3}([^;]+)/;
    print "'$desc'\n";
}
close $IN;

дает:

'Working as a Professor in University'
'He is a Software enginner at MNC'
'Working as a mechanical enginner'
person Lone Shepherd    schedule 19.02.2013
comment
я могу использовать только регулярное выражение // в своем коде, я не могу использовать код выше - person mahodaya; 19.02.2013
comment
Я предоставил является регулярным выражением. И поскольку вы не указали, какой язык используете, я предоставил пример реализации с использованием регулярного выражения. - person Lone Shepherd; 19.02.2013
comment
я использую язык aql для текстовой аналитики biginsight - person mahodaya; 19.02.2013

Это должно работать

/^[^\s]+\s+[^\s]+\s+[^\s]+\s+(.+)\s+[^\s]+$/m

или как указал одинокий пастух

/^\S+\s+\S+\s+\S+\s+(.+)\s+\S+$/m

или с запятой

/^[^;]+;[^;]+;+[^;]+;+(.+);+[^;]+$/m
person Eric    schedule 19.02.2013
comment
\S совпадает с [^\s] - person Lone Shepherd; 19.02.2013
comment
нет, это не работает 220;Джон;28;работает профессором в университете;Хайдарабад - person mahodaya; 19.02.2013
comment
Это почти работает, если вы можете использовать модификатор строки (m в php), так что ^ представляет начало строки, а $ представляет конец. В предыдущем примере я просто пропустил один столбец. /^[^\s]+\s+[^\s]+\s+[^\s]+\s+(.+)\s+[^\s]+$/m - person Eric; 19.02.2013
comment
А теперь я вижу, что вы вернулись к точкам с запятой. /^[^;]+;[^;]+;+[^;]+;+(.+);+[^;]+$/m - person Eric; 19.02.2013
comment
Нет, он отлично работает в PHP, используя preg_replace. Вы, конечно, даже не указали, нужно ли вам регулярное выражение perl, не говоря уже о том, для какого языка оно предназначено. - person Eric; 19.02.2013
comment
я использую язык аннотированных запросов для извлечения данных из текстовых файлов.... язык для текстовой аналитики IBM biginsight - person mahodaya; 19.02.2013
comment
Согласно документации, которую я читаю на этом языке, он должен работать. Конечно, это было без даты, добавленной туда. Это должно быть до тех пор, пока есть только 1 столбец после текста, который вы хотите /^.*;([^;]+);+[^;]+$/m (вам не нужен m) - person Eric; 19.02.2013
comment
/^.*;([^;]+);+[^;]+$/ также не извлекает мой вывод, он извлекает все данные в одну строку - person mahodaya; 19.02.2013

Кажется относительно простым:

https://regex101.com/r/W9nfsd/2

.*;(.*);.*$

Подобно ответу Анирудхи, но немного проще.

person Mark    schedule 04.01.2019