电影文件名的C#Regex
我一直试图使用C#Regex从电影名称中删除某些字符串,但没有成功 我使用的文件名示例有: 欧洲旅行社(2004)[SD] 事件视界(1997)[720] 快速与狂暴(2009)[1080p] 星际迷航(2009)[未知] 我想删除方括号或括号中的任何内容(包括括号本身) 到目前为止,我正在使用:电影文件名的C#Regex,c#,.net,regex,replace,movie,C#,.net,Regex,Replace,Movie,我一直试图使用C#Regex从电影名称中删除某些字符串,但没有成功 我使用的文件名示例有: 欧洲旅行社(2004)[SD] 事件视界(1997)[720] 快速与狂暴(2009)[1080p] 星际迷航(2009)[未知] 我想删除方括号或括号中的任何内容(包括括号本身) 到目前为止,我正在使用: movieTitleToFetch = Regex.Replace(movieTitleToFetch, "([*\\(\\d{4}\\)])", ""); 这似乎删除了年份和括号,但我就是不知道如
movieTitleToFetch = Regex.Replace(movieTitleToFetch, "([*\\(\\d{4}\\)])", "");
这似乎删除了年份和括号,但我就是不知道如何删除方括号和内容而不影响其他部分。。。我得到了各种各样的结果,但最接近的结果是:
movieTitleToFetch = Regex.Replace(movieTitleToFetch, "([?\\[+A-Z+\\]])", "");
这给我留下了:
urorip(2004)
而不是:
欧洲旅行社(2004)[SD]
在末尾留下的任何空白都可以,因为我将只执行
movieTitleToFetch = movieTitleToFetch.Trim();
最后
提前感谢,
Alex此正则表达式模式应该可以正常工作。。。也许需要一些调整
"[\[\(].+?[\]\)]"
Regex.Replace(movieTitleToFetch, @"[\[\(].+?[\]\)]", "");
这应该与“[”或“(“直到下一次出现“]”或“)之间的任何内容匹配
如果这不起作用,请尝试删除括号的转义字符,如下所示
Regex.Replace(movieTitleToFetch, @"[\[(].+?[\])]", "");
这个正则表达式模式应该可以正常工作。。。也许需要一些调整
"[\[\(].+?[\]\)]"
Regex.Replace(movieTitleToFetch, @"[\[\(].+?[\]\)]", "");
这应该与“[”或“(“直到下一次出现“]”或“)之间的任何内容匹配
如果这不起作用,请尝试删除括号的转义字符,如下所示
Regex.Replace(movieTitleToFetch, @"[\[(].+?[\])]", "");
我们不能用这个来代替:-
if(movieTitleToFetch.Contains("("))
movieTitleToFetch=movieTitleToFetch.Substring(0,movieTitleToFetch.IndexOf("("));
以上代码肯定会返回这些字符串的完美电影标题:-
欧洲旅行社(2004)[SD]
事件视界(1997)[720]
快速与愤怒(2009)[1080p]
《星际迷航》(2009)[未知]
如果发生以下情况,您将没有年份,但只有类型,即:-
欧洲旅行社[SD]
事件视界[720]
快速与愤怒[1080p]
星际迷航[未知]
那就用这个
if(movieTitleToFetch.Contains("("))
movieTitleToFetch=movieTitleToFetch.Substring(0,movieTitleToFetch.IndexOf("("));
else if(movieTitleToFetch.Contains("["))
movieTitleToFetch=movieTitleToFetch.Substring(0,movieTitleToFetch.IndexOf("["));
我们不能用这个来代替:-
if(movieTitleToFetch.Contains("("))
movieTitleToFetch=movieTitleToFetch.Substring(0,movieTitleToFetch.IndexOf("("));
以上代码肯定会返回这些字符串的完美电影标题:-
欧洲旅行社(2004)[SD]
事件视界(1997)[720]
快速与愤怒(2009)[1080p]
《星际迷航》(2009)[未知]
如果发生以下情况,您将没有年份,但只有类型,即:-
欧洲旅行社[SD]
事件视界[720]
快速与愤怒[1080p]
星际迷航[未知]
那就用这个
if(movieTitleToFetch.Contains("("))
movieTitleToFetch=movieTitleToFetch.Substring(0,movieTitleToFetch.IndexOf("("));
else if(movieTitleToFetch.Contains("["))
movieTitleToFetch=movieTitleToFetch.Substring(0,movieTitleToFetch.IndexOf("["));
这就是诀窍:
@"(\[[^\]]*\])|(\([^\)]*\))"
它删除“[”到下一个“]”和“(“到下一个”)”中的任何内容 这就做到了:
@"(\[[^\]]*\])|(\([^\)]*\))"
它删除“[”到下一个“]”和“(“到下一个”)”中的任何内容 @Craigt非常合适,但它可能更干净,以确保支架匹配
([\[].*?[\]]|[\(].*?[\)])
@Craigt非常合适,但它可能更干净,以确保支架匹配
([\[].*?[\]]|[\(].*?[\)])
你能用一下吗
string MovieTitle="Star Trek (2009) [Unknown]";
movieTitleToFetch= MovieTitle.IndexOf('(')>MovieTitle.IndexOf('[')?
MovieTitle.Substring(0,MovieTitle.IndexOf('[')):
MovieTitle.Substring(0,MovieTitle.IndexOf('('));
你能用一下吗
string MovieTitle="Star Trek (2009) [Unknown]";
movieTitleToFetch= MovieTitle.IndexOf('(')>MovieTitle.IndexOf('[')?
MovieTitle.Substring(0,MovieTitle.IndexOf('[')):
MovieTitle.Substring(0,MovieTitle.IndexOf('('));
我提出了+\s(?\(\d{4}\)\s(?\[\w+\])
,它与您的任何示例都匹配,并包含年份和命名为捕获组的格式,以帮助您替换它们
这种模式可以翻译为:
任何字符、一个或多个表示空白
文字'('后接4位数字,后接文字')(年份)
空白
文字'['后跟字母数字,一个或多个表示,后跟文字']'(格式)我想出了
+\s(?\(\d{4}\)\s(?\[\w+\])
,它与您的任何示例都匹配,并将年份和格式作为命名的捕获组来帮助您替换它们
这种模式可以翻译为:
任何字符、一个或多个表示空白
文字'('后接4位数字,后接文字')(年份)
空白
文字'['后跟字母数字,一个或多个表示,后跟文字']'(格式)我知道我在这个线程上迟到了,但我写了一个简单的算法来清理下载的电影文件名 这将运行以下步骤:
using System;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
namespace Grappachu.Movideo.Core.Helpers.TitleCleaner
{
public class MovieTitleCleanerResult
{
public string Title { get; set; }
public int? Year { get; set; }
public string SubTitle { get; set; }
}
public class MovieTitleCleaner
{
private const string SpecialMarker = "§=§";
private static readonly string[] ReservedWords;
private static readonly string[] SpaceChars;
private static readonly string[] Languages;
static MovieTitleCleaner()
{
ReservedWords = new[]
{
SpecialMarker, "hevc", "bdrip", "Bluray", "x264", "h264", "AC3", "DTS", "480p", "720p", "1080p"
};
var cultures = CultureInfo.GetCultures(CultureTypes.AllCultures);
var l = cultures.Select(x => x.EnglishName).ToList();
l.AddRange(cultures.Select(x => x.ThreeLetterISOLanguageName));
Languages = l.Distinct().ToArray();
SpaceChars = new[] {".", "_", " "};
}
public static MovieTitleCleanerResult Clean(string filename)
{
var temp = Path.GetFileNameWithoutExtension(filename);
int? maybeYear = null;
// Remove what's inside brackets trying to keep year info.
temp = RemoveBrackets(temp, '{', '}', ref maybeYear);
temp = RemoveBrackets(temp, '[', ']', ref maybeYear);
temp = RemoveBrackets(temp, '(', ')', ref maybeYear);
// Removes special markers (codec, formats, ecc...)
var tokens = temp.Split(SpaceChars, StringSplitOptions.RemoveEmptyEntries);
var title = string.Empty;
for (var i = 0; i < tokens.Length; i++)
{
var tok = tokens[i];
if (ReservedWords.Any(x => string.Equals(x, tok, StringComparison.OrdinalIgnoreCase)))
{
if (title.Length > 0)
break;
}
else
{
title = string.Join(" ", title, tok).Trim();
}
}
temp = title;
// Remove languages infos when are found before special markers (should not remove "English" if it's inside the title)
tokens = temp.Split(SpaceChars, StringSplitOptions.RemoveEmptyEntries);
for (var i = tokens.Length - 1; i >= 0; i--)
{
var tok = tokens[i];
if (Languages.Any(x => string.Equals(x, tok, StringComparison.OrdinalIgnoreCase)))
tokens[i] = string.Empty;
else
break;
}
title = string.Join(" ", tokens).Trim();
// If year is not found inside parenthesis try to catch at the end, just after the title
if (!maybeYear.HasValue)
{
var resplit = title.Split(SpaceChars, StringSplitOptions.RemoveEmptyEntries);
var last = resplit.Last();
if (LooksLikeYear(last))
{
maybeYear = int.Parse(last);
title = title.Replace(last, string.Empty).Trim();
}
}
// TODO: review this. when there's one dash separates main title from subtitle
var res = new MovieTitleCleanerResult();
res.Year = maybeYear;
if (title.Count(x => x == '-') == 1)
{
var sp = title.Split('-');
res.Title = sp[0];
res.SubTitle = sp[1];
}
else
{
res.Title = title;
}
return res;
}
private static string RemoveBrackets(string inputString, char openChar, char closeChar, ref int? maybeYear)
{
var str = inputString;
while (str.IndexOf(openChar) > 0 && str.IndexOf(closeChar) > 0)
{
var dataGraph = str.GetBetween(openChar.ToString(), closeChar.ToString());
if (LooksLikeYear(dataGraph))
{
maybeYear = int.Parse(dataGraph);
}
else
{
var parts = dataGraph.Split(SpaceChars, StringSplitOptions.RemoveEmptyEntries);
foreach (var part in parts)
if (LooksLikeYear(part))
{
maybeYear = int.Parse(part);
break;
}
}
str = str.ReplaceBetween(openChar, closeChar, string.Format(" {0} ", SpecialMarker));
}
return str;
}
private static bool LooksLikeYear(string dataRound)
{
return Regex.IsMatch(dataRound, "^(19|20)[0-9][0-9]");
}
}
public static class StringUtils
{
public static string GetBetween(this string src, string a, string b,
StringComparison comparison = StringComparison.Ordinal)
{
var idxStr = src.IndexOf(a, comparison);
var idxEnd = src.IndexOf(b, comparison);
if (idxStr >= 0 && idxEnd > 0)
{
if (idxStr > idxEnd)
Swap(ref idxStr, ref idxEnd);
return src.Substring(idxStr + a.Length, idxEnd - idxStr - a.Length);
}
return src;
}
private static void Swap<T>(ref T idxStr, ref T idxEnd)
{
var temp = idxEnd;
idxEnd = idxStr;
idxStr = temp;
}
public static string ReplaceBetween(this string s, char begin, char end, string replacement = null)
{
var regex = new Regex(string.Format("\\{0}.*?\\{1}", begin, end));
return regex.Replace(s, replacement ?? string.Empty);
}
}
}
使用系统;
利用制度全球化;
使用System.IO;
使用System.Linq;
使用System.Text.RegularExpressions;
命名空间graphpachu.Movideo.Core.Helpers.TitleCleaner
{
公共级电影
{
公共字符串标题{get;set;}
公共整数?年份{get;set;}
公共字符串字幕{get;set;}
}
公共级电影剪辑师
{
private const string SpecialMarker=“§=§”;
私有静态只读字符串[]保留字;
私有静态只读字符串[]空格字符;
私有静态只读字符串[]语言;
静态电影清洁器()
{
ReservedWords=new[]
{
特别营销员,“hevc”、“bdrip”、“Bluray”、“x264”、“h264”、“AC3”、“DTS”、“480p”、“720p”、“1080p”
};
var cultures=CultureInfo.GetCultures(CultureTypes.AllCultures);
var l=cultures.Select(x=>x.EnglishName.ToList();
l、 AddRange(cultures.Select(x=>x.ThreeLetterIsLanguageName));
语言=l.Distinct().ToArray();
SpaceChars=new[]{“.”、“”、”};
}
公共静态MovietItleLeanerResult Clean(字符串文件名)
{
var temp=Path.GetFileNameWithoutExtension(文件名);
int?maybeYear=null;
//雷莫