注意
我需要一个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