有没有一种方法可以让字符串一直到一年的值

本文关键字:一直 字符串 一年 一种 方法 有没有 | 更新日期: 2023-09-27 18:21:10

基本上我有一些文件名,其中有一年在中间。我只想得到年份值之前的任何字母或数字,但只想得到字母和数字,而不是逗号、点、下划线等。这可能吗?也许和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位数识别为年份。

有没有一种方法可以让字符串一直到一年的值

你必须分两部分来完成这项工作——第一部分是删除你不想要的符号,第二部分是获取今年的所有内容(反之亦然)。

要在一年内完成所有任务,您可以使用:

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

我制作了年份正则表达式,因此它只匹配20世纪或21世纪初的事物,以确保如果四位数不是年份,则不会将其作为年份匹配(例如"Ali-Baba-And-the-1234-Thieves.2011")。

然而,如果你的电影片名涉及一年,那么这就不会真正奏效(《2001:太空漫游》(1968))。

要替换所有非字符,可以将"[^a-zA-Z0-9]"替换为""。(我允许使用数字,因为一部电影的片名中可能有合法的数字)。

根据以下评论更新

  • 如果你从年底开始寻找年份,你可能会做得更好。找出最近出现的年份作为年份。因此,我在正则表达式中将.*?更改为.*,以便标题尽可能贪婪,并且只使用最后一年的候选年份作为年份
  • 在年底regex中添加了(?!'d),在开始时添加了(?<!'d),这样它就不会匹配"My-title-1"而不是"My-tiTL-120012-fdsa"&"My-title-120012-fdsa"中的"2001"(我没有添加边界'b,因为标题可能是"A-Good-Life2010",它在一年中没有边界)
  • 将字符串更改为原始字符串(@"..."),这样我就不必担心由于C#解释反斜杠而在正则表达式中转义反斜杠了

你可以试试这个

/'b'd{4}'b/

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

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

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

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

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