Сплит линия с Perl в зависимости от ее формата - PullRequest
0 голосов
/ 14 сентября 2011

У меня есть строка (разбор HTML), которая может быть двумя способами (в зависимости от языка сайта):

формат строки 1:

Roles: Lee Jae Ryong (Im Sang Ok), Hong Eun Hee (Mi Geum (soţia lui Sang Ok)) Credits: Lee Jae Ryong (Im Sang Ok) Hong Eun Hee (Mi Geum (soţia lui Sang Ok))

формат строки 2:

Role(s): Lee Jae Ryong (Im Sang Ok), Hong Eun Hee (Mi Geum (soţia lui Sang Ok)) Credit(s): Lee Jae Ryong (Im Sang Ok) Hong Eun Hee (Mi Geum (soţia lui Sang Ok))

Я хочу разбить эту строку на perl, в зависимости от ее формата в:

Roles: Lee Jae Ryong (Im Sang Ok) Hong Eun Hee (Mi Geum (soţia lui Sang Ok))
Credits: Lee Jae Ryong (Im Sang Ok) Hong Eun Hee (Mi Geum (soţia lui Sang Ok))

или

Role(s): Lee Jae Ryong (Im Sang Ok) Hong Eun Hee (Mi Geum (soţia lui Sang Ok))
Credit(s): Lee Jae Ryong (Im Sang Ok) Hong Eun Hee (Mi Geum (soţia lui Sang Ok))

Ответы [ 4 ]

0 голосов
/ 14 сентября 2011

Это, кажется, работает хорошо. Конечно, дополнительные двоеточия могут все испортить.

s/\s(\S+:)/ \n$1/; 

Это просто добавит новую строку, так что печать работает. Если хотите, вы можете разбить строку на новую строку, split /\n/, $string, если хотите, чтобы она была в массиве.

0 голосов
/ 14 сентября 2011

Как насчет:

split /(\S*:)/, $string;
0 голосов
/ 14 сентября 2011

Похоже, вы хотите посмотреть вперед на 0 ширины ((?=...) ниже)

split /(?=Credit[(]?s[)]?:)/

Это более простое регулярное выражение, чем могло бы быть. В обмен на простоту вы включаете больше случаев, чем вы думаете. Это позволяет Credit(s: или Credits):, при условии, что вы вряд ли увидите те случаи в ваших данных, которые вам необходимо различать. Опять же, вы можете просто захотеть включить их, не желая исключать строки, содержащие небольшие опечатки.

Более полная и сложная спецификация будет:

split /(?=Credit(?:s|[(]s[)]):)/

, который тоже работает.

  • Имейте в виду, что любой персонаж, выпадающий из группы прогнозирования, будет удален из одного из полученных кусков. Поэтому, если вы просто хотите сломать на шаблон, все символы шаблона должны попадать в поле зрения.
0 голосов
/ 14 сентября 2011

Существует более одного способа сделать это (как обычно, в perl).Одним из способов является использование регулярного выражения, подобного следующему:

(Credit.*?:) (.*?\)) (.*)

Смотрите его в действии здесь .Это по существу делит строку на три части, где:

  • первая часть (Credit.*?:) начинается с Credit и заканчивается первым : символом (пробел, следующий сразу за :отбрасывается)
  • вторая часть (.*?\)) начинается сразу после пробела, следующего сразу за первой частью, и заканчивается первым ) символом
  • , третья часть - это просто все остальныестрока

С вашим обновленным вопросом это стало еще проще:

(Role.*?) (Credit.*)

Смотрите его в действии здесь :

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...