Почему это регулярное выражение не соответствует этому?

116
9

Я использую следующее регулярное выражение (в java), чтобы получить id, tittle и год из фильма определенного актера в IMDB.

/title/tt(\\d+)/\"\\s+itemprop=\"performerIn\"\\s*>\\s*(([\\(|\\)|\\d+;|\\w|!|/|:|-|.|,| ]+) \\(\\d\\d\\d\\d\\))</a>

(Самая важная часть регулярного выражения - это то, что после "performerIn"). Я столкнулся с проблемой на этой странице, чтобы получить название "Звездные войны: Эпизод III - Месть ситхов (2005)". Это не соответствует. Что происходит?

спросил(а) 2021-01-25T19:07:57+03:00 4 месяца, 4 недели назад
1
Решение
77

Символ - это особый символ внутри выражения скобки, который обозначает диапазон. Например, [AZ] соответствует диапазону символов от A до Z, а не символы A, - и Z

Таким образом, если вы хотите захватить его, как в Episode III - Escape of the Sith, вам нужно сбежать от него с помощью \\-:

/title/tt(\\d+)/\"\\s+itemprop=\"performerIn\"\\s*>\\s*(([\\(|\\)|\\d+;|\\w|!|/|:|\\-|.|,| ]+) \\(\\d\\d\\d\\d\\))</a>

Кроме того, при использовании выражения скобки вам не нужно использовать трубку (|). Это целая точка выражения скобки. Итак, вместо использования [,|:| ] [,|:| ], Чтобы соответствовать ,, :, и пробелы, используйте [,: ] instead. [, |: | ] will match all those characters **AND** the pipe character itself, since inside a bracket expression, with the exception of - and ^ 'в начале, все сопоставляется как литерал.

ответил(а) 2021-01-25T19:07:57+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема