Есть ли способ получить строку до годового значения? - PullRequest
1 голос
/ 23 января 2012

В основном у меня есть несколько имен файлов, где посередине год.Меня интересует только получение любой буквы или цифры вплоть до значения года, но только буквы и цифры, а не запятые, точки, подчеркивания и т. Д. Возможно ли это?Может быть с Regex?

Например:

"A-Good-Life-2010-For-Archive"
"Any.Chararacter_Can+Come.Before!2011-RedundantInfo"
"WhatyouseeIsWhatUget.2012-Not"
"400-Gestures.In1.2000-Communication"

, где я хочу:

"AGoodLife"
"AnyChararacterCanComeBefore"
"WhatyouseeIsWhatUget"
"400GesturesIn1"

Под числами я подразумеваю любое число, которое не похоже на год,т.е. 1 цифра, 2 цифры, 3 цифры, 5 цифр и так далее.Я хочу распознать только 4 цифры как годы.

Ответы [ 5 ]

1 голос
/ 23 января 2012

Вы можете использовать Regex.Split(), чтобы сделать код еще более кратким (и, возможно, более быстрым из-за более простого регулярного выражения):

var str = "400-Gestures.In1.2000-Communication";

var re = new Regex(@"(^|\D)\d{4}(\D|$)");
var start = re.Split(str)[0];

// remove nonalphanumerics
var result = new string(start.Where(c=>Char.IsLetterOrDigit(c)).ToArray());
1 голос
/ 23 января 2012
using System.Text.RegularExpressions;


string GoodParts(string input) {
  Regex re = new Regex(@"^(.*\D)\d{4}(\D|$)");
  var match = re.Match(input);
  string result = Regex.Replace(match.Groups[1].Value, "[^0-9a-zA-Z]+", "");
  return result;
}
1 голос
/ 23 января 2012

вы можете попробовать вот так

/\b\d{4}\b/

d {4} \ b будет соответствовать четырем d на границе слова. В зависимости от входных данных вы также можете рассмотреть возможность добавления другой границы слова (\ b) в начале.

1 голос
/ 23 января 2012

Вам придется сделать это в двух частях - во-первых, чтобы удалить ненужные символы, а во-вторых, чтобы захватить все до года (или наоборот).

Чтобы сделать захватвсе до года, вы можете использовать:

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 #.
0 голосов
/ 23 января 2012

Полагаю, вы хотите необычное регулярное выражение?

Почему бы не простой цикл for?

digitCount = 0;
for i = 0 to strlen(filename)
{
  if isdigit(fielname[i])
  {
     digitCount++;
     if digitCount == 4
        thePartOfTheFileNameThatYouWant = strcpy(filename, 0, i-4)
  }
  else digitCount = 0;     
}

// Извините, я не знаю C-sharp

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...