Regex — извлечение номеров томов и глав из названий книг

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

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! Может ли кто-нибудь помочь мне в этом?


person Community    schedule 21.03.2011    source источник


Ответы (4)


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

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

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

In this link :

  • элемент [0] в массиве относится к массиву совпадений
  • элемент [1] массив томов
  • элемент [2] массив глав

  • I assumed that volumes always comes before chapters as stated in your examples.

    person Stephan    schedule 21.03.2011
    comment
    Есть ли простой способ преобразовать числа n-го формата в их цифру, равную? например Восьмой => 8 - person ; 25.03.2011
    comment
    @artarad преобразовать числа n-го формата в их цифру, равную Это слишком усложнило бы регулярное выражение. Поскольку большая часть тяжелой и грязной работы уже сделана регулярным выражением, вы можете легко создать функцию, которая будет преобразовывать n-й формат в его цифровой аналог: используйте array_walk. Я оставляю вам это задание в качестве упражнения ;) - person Stephan; 25.03.2011

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

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

    person Michael McTiernan    schedule 21.03.2011

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

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

    person Josh M.    schedule 21.03.2011

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

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

    или что-то.

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

    person Syntax Error    schedule 21.03.2011
    comment
    Другим весьма полезным ресурсом, ИМО, является regular-expressions.info. - person Michael McTiernan; 21.03.2011