Вам придется сделать это в двух частях - во-первых, чтобы удалить ненужные символы, а во-вторых, чтобы захватить все до года (или наоборот).
Чтобы сделать захватвсе до года, вы можете использовать:
Match match = Regex.Match(movieTitle,@"(.*)(?<!\d)(?:19|20)[0-9]{2}(?!\d)");
// if match.Success, result is in match.Groups[1].value
Я сделал регулярное выражение года, так что оно соответствует только в 1900-х или 2000-х, чтобы убедиться, что вы не соответствует четырехзначным числам, какгод, если они не год (например, «Али-Баба-и-1234-Thieves.2011»).
Однако, если название вашего фильма включает год, тогда это не будет работать("2001: -Space-Odyssey (1968)").
Чтобы затем заменить все не-символы, вы можете заменить "[^a-zA-Z0-9]"
на ""
.(Я допустил цифры, потому что в названии фильма могут быть допустимые цифры).
ОБНОВЛЕНО из комментариев ниже:
- , если вы выполняете поиск с концачтобы найти год, вы могли бы сделать лучше.то есть найти кандидата на последний год в качестве года.Следовательно, я изменил
.*?
на .*
в регулярном выражении, чтобы заголовок был как можно более жадным и использовал только последний год-кандидата в качестве года. - Добавлен
(?!\d)
вконец года, регулярное выражение и (?<!\d)
в начале, чтобы оно не совпадало с «My-title-1» вместо «My-title-120012-fdsa» и «2001» в «My-title-120012».-fdsa "(я не добавил границу \b
, потому что заголовок может быть" A-Good-Life2010 ", который не имеет границы в течение года). - изменил строку на необработанную строку (
@"..."
), поэтому мне не нужно беспокоиться о том, чтобы избежать обратного слеша в регулярном выражении из-за интерпретации обратного слэша в C #.