有没有一种方法可以让字符串一直到一年的值
本文关键字:一直 字符串 一年 一种 方法 有没有 | 更新日期: 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