C# 使用正则表达式获取文件名的中间部分 我需要一个正则表达式,它可以在文件名中间返回10个字符。 filename: returns: msl_0123456789_otherstuff.csv -> 0123456789 msl_test.xml -> test anythingShort.w1 -> anythingSh

C# 使用正则表达式获取文件名的中间部分 我需要一个正则表达式,它可以在文件名中间返回10个字符。 filename: returns: msl_0123456789_otherstuff.csv -> 0123456789 msl_test.xml -> test anythingShort.w1 -> anythingSh,c#,regex,C#,Regex,我可以使用以下正则表达式捕获要删除的开始和结束: Regex.Replace(filename, "(^msl_)|([.][[:alnum:]]{1,3}$)", string.Empty); * 但我也需要只有10个字符,当我完成 对上述正则表达式的解释: (^msl)-匹配以“msl”开头的行 |-或 ([.]-匹配句点 [[:alnum]{1,3}-后跟1-3个字母数字字符 $)-在行尾 使用替换来替换,从字符串的开始和结束移除任何一个备选方案,但是当扩展不存在

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

Regex.Replace(filename, "(^msl_)|([.][[:alnum:]]{1,3}$)", string.Empty); *
但我也需要只有10个字符,当我完成

对上述正则表达式的解释:

  • (^msl)
    -匹配以“msl”开头的行
  • |
    -或
  • ([.]
    -匹配句点
  • [[:alnum]{1,3}
    -后跟1-3个字母数字字符
  • $)
    -在行尾

使用替换来替换,从字符串的开始和结束移除任何一个备选方案,但是当扩展不存在时,它也将工作,并且在中间不考虑字符数。 如果文件扩展名应该存在,您可以使用一个捕获组,并在开始时将

msl\uu
设置为可选

然后将一个单词字符匹配1-10次,除了
,然后再匹配可选的单词字符,直到

^(?:msl_)?([^\W_]{1,10})\w*\.[^\W_]{2,}$
(单击“表格”选项卡)


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

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

输出

0123456789
test
anythingSh

注意
[[:alnum:][]
无法在.NET正则表达式中工作,因为它不支持POSIX字符类。您可以使用
\w
(匹配字母、数字、下划线)或
[^\w\u]
(匹配字母或数字)

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

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


[[:alnum:]
无法在C#.NET正则表达式中工作,它不支持POSIX字符类。这种模式不适合你,是吗?
new string(Regex.Replace(s, @"^msl_|\.\w{1,3}$","").Take(10).ToArray())
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