Ответ 1
Попробуйте здесь
\b[a-zA-Z]+(?:\s+\d+)?(?::\d+(?:–\d+)?(?:,\s*\d+(?:–\d+)?)*)?
Смотрите и протестируйте его здесь, в Regexr
Из-за (?:,\s*\d+(?:–\d+)?)*
в конце вы можете иметь список стихов, стихи варьируются в конце.
Я борюсь с созданием регулярного выражения для синтаксического анализа таких строк (библейские стихи):
'John 14:16–17, 25–26'
'John 14:16–17'
'John 14:16'
'John 14'
'John'
Итак, основной шаблон:
Book [[Chapter][:Verse]]
где глава и стих необязательны.
Попробуйте здесь
\b[a-zA-Z]+(?:\s+\d+)?(?::\d+(?:–\d+)?(?:,\s*\d+(?:–\d+)?)*)?
Смотрите и протестируйте его здесь, в Regexr
Из-за (?:,\s*\d+(?:–\d+)?)*
в конце вы можете иметь список стихов, стихи варьируются в конце.
Я думаю, что это делает то, что вам нужно:
\w+\s?(\d{1,2})?(:\d{1,2})?([-–]\d{1,2})?(,\s\d{1,2}[-–]\d{1,2})?
Предположения:
-
и –
Ниже приведено регулярное выражение с комментариями:
"
\w # Match a single character that is a "word character" (letters, digits, and underscores)
+ # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
\s # Match a single character that is a "whitespace character" (spaces, tabs, and line breaks)
? # Between zero and one times, as many times as possible, giving back as needed (greedy)
( # Match the regular expression below and capture its match into backreference number 1
\d # Match a single digit 0..9
{1,2} # Between one and 2 times, as many times as possible, giving back as needed (greedy)
)? # Between zero and one times, as many times as possible, giving back as needed (greedy)
( # Match the regular expression below and capture its match into backreference number 2
: # Match the character ":" literally
\d # Match a single digit 0..9
{1,2} # Between one and 2 times, as many times as possible, giving back as needed (greedy)
)? # Between zero and one times, as many times as possible, giving back as needed (greedy)
( # Match the regular expression below and capture its match into backreference number 3
[-–] # Match a single character present in the list "-–"
\d # Match a single digit 0..9
{1,2} # Between one and 2 times, as many times as possible, giving back as needed (greedy)
)? # Between zero and one times, as many times as possible, giving back as needed (greedy)
( # Match the regular expression below and capture its match into backreference number 4
, # Match the character "," literally
\s # Match a single character that is a "whitespace character" (spaces, tabs, and line breaks)
\d # Match a single digit 0..9
{1,2} # Between one and 2 times, as many times as possible, giving back as needed (greedy)
[-–] # Match a single character present in the list "-–"
\d # Match a single digit 0..9
{1,2} # Between one and 2 times, as many times as possible, giving back as needed (greedy)
)? # Between zero and one times, as many times as possible, giving back as needed (greedy)
"
И вот несколько примеров его использования в php:
if (preg_match('/\w+\s?(\d{1,2})?(:\d{1,2})?([-–]\d{1,2})?(,\s\d{1,2}[-–]\d{1,2})?/', $subject)) {
# Successful match
} else {
# Match attempt failed
}
Получить массив всех совпадений в заданной строке
preg_match_all('/\w+\s?(\d{1,2})?(:\d{1,2})?([-–]\d{1,2})?(,\s\d{1,2}[-–]\d{1,2})?/', $subject, $result, PREG_PATTERN_ORDER);
$result = $result[0];
Используйте это регулярное выражение:
[A-Za-z]+( ([0-9]+)(:[0-9]+)?([\-–][0-9]+)?(, [0-9]+[\-–][0-9]+)?)?
Или в его "более симпатичной" версии:
\w+( (\d+)(:\d+)?([\-–]\d+)?(, \d+[\-–]\d+)?)?
ОБНОВЛЕНО: Чтобы сопоставить тире или дефисы
ПРИМЕЧАНИЕ. Я тестировал его и соответствует всем 5 возможным версиям.
Пример: http://regexr.com?30h4q
([1|2|3]?([i|I]+)?(\s?)\w+(\s+?))((\d+)?(,?)(\s?)(\d+))+(:?)((\d+)?([\-–]\d+)?(,(\s?)\d+[\-–]\d+)?)?
работает практически для каждой книги...
(\b[a-zA-Z]\w+\s\d+)(:\d+)+([-–]\d+)?([,;](\s)?(\d+:)?\d+([-–]\d+)?)?
Это гибрид всего кода, представленного здесь. Единственными форматами, которые он не будет выделять, являются "только имя книги" или "только книга и глава" (просто добавьте ": 1-all" после главы #) Я обнаружил, что другие коды предоставили для того, чтобы квалифицировать слишком много вариаций, а не в соответствии с библией синтаксис стихов.
Это примеры, которые я тестировал в RegExr: (пока не удается опубликовать изображения)
Джонhumbolt 14: 16-17, 25-26
Джон 14: 16-17
Джон 14:16
Иоанн 77: 3; 2: 9-11
Джон 5: 1-всеbrad 555-783-6867Джон 6привет, как вы
Эзра 32: 5 Джон 14: 16-17, 25-361223:34
Джон 14: 16-17,25-36
Иоанн 14: 16-17; 32:25