使用regex获取文件名的中间部分



我需要一个regex,它可以在文件名中间返回多达10个字符。

filename:                          returns:
msl_0123456789_otherstuff.csv ->   0123456789
msl_test.xml                  ->   test
anythingShort.w1             ->   anythingSh

我可以用以下正则表达式捕获删除的开始和结束:

Regex.Replace(filename, "(^msl_)|([.][[:alnum:]]{1,3}$)", string.Empty); *

但我也需要只有10个字符当我完成。

上面正则表达式的解释:

  • CCD_ 1-匹配以";msl_
  • |-或
  • ([.]-匹配周期
  • [[:alnum]]{1,3}-后面跟着1-3个字母数字字符
  • $)-在线路末端
注意[[:alnum:]]不能在.NET正则表达式中工作,因为它不支持POSIX字符类。您可以使用w(匹配字母、数字、下划线(或[^W_](匹配字母或数字(。

您可以使用正则表达式,只保留字符串中的前10个字符:

new string(Regex.Replace(s, @"^msl_|.w{1,3}$","").Take(10).ToArray())

在线查看C#演示:

var strings = new List<string> { "msl_0123456789_otherstuff.csv", "msl_test.xml", "anythingShort.w1" };
foreach (var s in strings) 
{
Console.WriteLine("{0} => {1}", s, new string(Regex.Replace(s, @"^msl_|.w{1,3}$","").Take(10).ToArray()));
}

输出:

msl_0123456789_otherstuff.csv => 0123456789
msl_test.xml => test
anythingShort.w1 => anythingSh

使用替换替换,从字符串的开头和结尾删除替换中的任何一个,但当扩展不存在并且不考虑在中间的字符数时,它也会起作用。

如果文件扩展名应该存在,则可以使用捕获组,并在开始时使msl_可选。

然后匹配1-10次除(^msl_)0以外的单词字符,然后匹配可选单词字符,直到.

^(?:msl_)?([^W_]{1,10})w*.[^W_]{2,}$

.NET正则表达式演示(单击表格选项卡(


更宽的匹配可以使用S而不是w,并匹配到最后一个点:

^(?:msl_)?(S{1,10})S*.[^W_]{2,}$

查看另一个regex演示|C#演示

string[] strings = {"msl_0123456789_otherstuff.csv", "msl_test.xml","anythingShort.w1", "123456testxxxxxxxx"};
string pattern = @"^(?:msl_)?(S{1,10})S*.[^W_]{2,}$";
foreach (String s in strings) {
Match match = Regex.Match(s, pattern);
if (match.Success)
{
Console.WriteLine(match.Groups[1]);
}                            
}

输出

0123456789
test
anythingSh

最新更新