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