Regex - Извлечение тома и номеров глав из названий книг - PullRequest
2 голосов
/ 21 марта 2011

Привет,
Я пытаюсь импортировать некоторые устаревшие данные в совершенно новую систему, это почти сделано, но есть огромная проблема!Предполагая, что эти любопытные данные:

Blabla Vol.1 chapter 2
ABCD in the era of XYZ volume 2 First Chapter  
A really useless book Eighth vol  
Blala Sixth Vol Chapter 5  
Lablah V6C7 2002  
FooBar Vol6 C3 by Dr. Foo Bar
Regex: A tool in Hell V1 Eleventh Chapter

Запутано !!Я пытался написать это регулярное выражение для извлечения номеров томов и глав, но вы знаете, что это REGEX!Может кто-нибудь, пожалуйста, проведите меня через это?

Ответы [ 4 ]

1 голос
/ 21 марта 2011

Вот регулярное выражение, которое будет соответствовать вашему примеру:

<code>/^.+?(?|(?:\bVol.?|\bvolume[ ]+|V)(\d+)|[ ]+([a-z]+)[ ]+vol\b).<em>?(?:(?|(?:C|chapter[ ]+)(\d+)|[ ]+([a-z]+)[ ]+Chapter\b).</em>?)?$/im

Вы можете редактировать регулярное выражение и / или добавлять тесты здесь .

В этой ссылке :

элемент [0] в массиве ссылается на массив совпадений элемент [1] массив томов element [2] массив глав
Я предположил, что тома всегда идут перед главами, как указано в ваших примерах.
1 голос
/ 21 марта 2011

Поскольку эти выражения вовсе не являются "регулярными", одно регулярное выражение будет затруднено. Если у вас есть конечный набор «способов» отображения главы и тома, вы можете использовать несколько регулярных выражений, чтобы попытаться извлечь эту информацию.

Или, если вы можете определить некоторые правила, такие как «номер главы всегда в формате [chapter #]», то это также поможет!

1 голос
/ 21 марта 2011

На мой взгляд, всегда лучше разбить это на отдельные шаги. На первом этапе вы можете преобразовать заголовки с помощью шаблона "/Vol.[0-9]+\s+chapter\s[0-9]+$/i". Во втором проходе вы можете преобразовать заголовки, соответствующие шаблону "/ [a-z] + (th | nd | st) \ svol / i". И т.д.

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

0 голосов
/ 21 марта 2011

Если выходные данные всегда совпадают в одних и тех же строках, первое, что я бы сделал, - это разнесение ("\ n", $ data) и работа с правильной строкой. Если вы согласны, вы можете выбрать

'/ (.*) Vol Chapter ([0-9]*)/'

или что-то.

Кстати, эта страница всегда помогала мне в тестировании регулярных выражений. http://www.quanetic.com/Regex

...