有没有办法让字符串达到一年的价值?

时间:2012-01-23 01:45:15

标签: c# .net regex string parsing

基本上我有一些文件名,中间有一年。我只对收到任何字母或数字感兴趣,直到年份值,但只有字母和数字,而不是逗号,点,下划线等。是否可能?也许与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 个答案:

答案 0 :(得分:1)

你可以这样尝试

/\b\d{4}\b/

d {4} \ b将匹配单词边界处的四个。根据输入数据,您可能还需要考虑在开头添加另一个单词边界(\ b)。

答案 1 :(得分:1)

你必须分两部分来做 - 首先删除你不想要的符号,然后再抓住一年中的所有符号(反之亦然)。

要抓住一年中的所有内容,您可以使用:

Match match = Regex.Match(movieTitle,@"(.*)(?<!\d)(?:19|20)[0-9]{2}(?!\d)");
// if match.Success, result is in match.Groups[1].value

我已经制作了年度正则表达式,因此它只匹配20世纪或2000年代的东西,以确保如果它们不是一年就不会匹配四位数字(例如“Ali-Baba-And” -the-1234-Thieves.2011" )。

但是,如果你的电影片名涉及一年,那么这将无法奏效(“2001:-Space-Odyssey(1968)”)。

要替换所有非字符,您可以将"[^a-zA-Z0-9]"替换为""。 (我允许数字,因为电影可能在标题中有合法的数字。)

来自以下评论的

更新

  • 如果你从最后搜索找到你可能会做得更好的一年。即找到最新的年度候选人作为年份。因此,我在正则表达式中将.*?更改为.*,以便标题尽可能贪婪,并且仅使用去年候选人作为年份。
  • 在年末正则表达式中添加(?!\d)并在开头添加(?<!\d),使其与“My-title-1”不匹配,而不是“My-title-120012-” fdsa“&amp; “我的标题 - 120012-fdsa”中的“2001”(我没有添加边界\b,因为标题可能是“A-Good-Life2010”,它在一年中没有边界。)
  • 将字符串更改为原始字符串(@"..."),因此我不需要担心因为C#解释反斜杠而在正则表达式中转义反斜杠。

答案 2 :(得分:1)

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;
}

答案 3 :(得分:1)

您可以使用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());

答案 4 :(得分:0)

我想你想要一个花哨的正则表达式?

为什么不是一个简单的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