Регулярное выражение - Извлечение номеров томов и глав из названий книг
Эй,
Я пытаюсь импортировать некоторые устаревшие данные в совершенно новую систему, это почти сделано, но есть огромная проблема! Предполагая такие данные:
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
Сбит с толку!! Я пытался написать это регулярное выражение, чтобы извлечь номера томов и глав, но вы знаете, что это РЕГУЛЯРНОЕ выражение! Кто-нибудь может, пожалуйста, провести меня через это?
4 answers
Вот регулярное выражение, которое будет соответствовать вашему примеру:
/^.+?(?|(?:\bVol.?|\bvolume[ ]+|V)(\d+)|[ ]+([a-z]+)[ ]+vol\b).?(?:(?|(?:C|chapter[ ]+)(\d+)|[ ]+([a-z]+)[ ]+Chapter\b).?)?$/im
Вы можете редактировать регулярное выражение и/или добавлять тесты здесь.
Я предполагал, что объемы всегда приходит раньше главы, как указано в ваших примерах.
На мой взгляд, всегда лучше разбить это на отдельные шаги. На первом шаге вы можете преобразовать заголовки с шаблоном "/Vol.[0-9]+\s+глава\s[0-9]+$/i". Во втором проходе вы можете преобразовать заголовки, соответствующие шаблону "/[a-z]+(th|nd|st)\svol/i". И т. Д.
Попытка написать одно регулярное выражение, чтобы охватить все эти случаи, обычно заканчивается плохо и почти всегда приводит к ошибкам. Вот интересная статья, которую я нашел на днях подробно описывая опасности чрезмерно сложного регулярного выражения.
Поскольку эти выражения вообще не являются "регулярными", одно регулярное выражение будет затруднено. Если у вас есть конечный набор "способов" отображения главы и тома, вы можете использовать несколько регулярных выражений, чтобы попытаться извлечь эту информацию.
Или если вы можете определить некоторые правила, такие как "номер главы всегда в формате [глава #]", то это также поможет!
Если вывод всегда один и тот же в одних и тех же строках, первое, что я бы сделал, это взорвался ("\n", $data) и работал с правильной строкой. Если бы вы были последовательны, вы могли бы затем сопоставить
'/ (.*) Vol Chapter ([0-9]*)/'
Или что-то в этом роде.
Кстати, эта страница всегда помогала мне в тестировании регулярных выражений. http://www.quanetic.com/Regex