Регулярное выражение - Извлечение номеров томов и глав из названий книг


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

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

Сбит с толку!! Я пытался написать это регулярное выражение, чтобы извлечь номера томов и глав, но вы знаете, что это РЕГУЛЯРНОЕ выражение! Кто-нибудь может, пожалуйста, провести меня через это?

Author: Stephan, 2011-03-21

4 answers

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

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

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

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

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

  • Я предполагал, что объемы всегда приходит раньше главы, как указано в ваших примерах.
     1
    Author: Stephan, 2011-03-21 12:35:48

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

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

     1
    Author: Michael McTiernan, 2011-03-21 03:29:57

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

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

     1
    Author: Josh M., 2011-03-21 03:30:48

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

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

    Или что-то в этом роде.

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

     0
    Author: Syntax Error, 2011-03-21 03:42:21