在c#中获取字符串的各个部分并将它们组合起来

本文关键字:起来 组合 个部 获取 字符串 | 更新日期: 2023-09-27 18:17:24

我有一个这样的字符串:C:'Projects'test'whatever'files'media'10'00'00'80'test.jpg

现在,我要做的是动态地组合最后4个数字,在本例中,结果是10000080。我的想法是把它们分开,然后以某种方式组合起来,有没有更简单的方法?我不能依赖于数组索引,因为路径也可以更长或更短。

有什么好办法吗?

谢谢:)

在c#中获取字符串的各个部分并将它们组合起来

使用字符串的紧凑方式。连接Regex.Split.

string text = @"C:'Projects'test'whatever'files'media'10'00'00'80'test.jpg";
string newString = string.Join(null, Regex.Split(text, @"[^'d]"));    //10000080

使用字符串。分裂

String toSplit = "C:'Projects'test'whatever'files'media'10'00'00'80'test.jpg";
String[] parts = toSplit.Split(new String[] { @"'" });
String result = String.Empty;
for (int i = 5, i > 1; i--)
{
   result += parts[parts.Length - i];
}
// Gives the result 10000080

如果最后一部分始终是文件名,则可以依赖数组索引。因为最后一部分总是

array_name [array_name。长度- 1]

之前的4个部分可以通过

找到

array_name [array_name。长度- 2]

array_name [array_name。长度- 3]

如果你总是想要组合最后四个数字,拆分字符串(使用'作为分隔符),从最后一部分开始计数,取4个数字,或4个几乎是最后的部分。

如果你想取所有的数字,只需从头到尾扫描字符串,只复制数字到一个新的字符串

string input = "C:'Projects'test'whatever'files'media'10'00'00'80'test.jpg";
string[] parts = toSplit.Split(new char[] {''''});
IEnumerable<string> reversed = parts.Reverse();
IEnumerable<string> selected = reversed.Skip(1).Take(4).Reverse();
string result = string.Concat(selected);

这个想法是提取部分,将它们反转以只保留最后4个(不包括文件名),然后重新反转以回滚到初始顺序,然后concat.

Using LINQ:

string path = @"C:'Projects'test'whatever'files'media'10'00'00'80'test.jpg";
var parts = Path.GetDirectoryName(path).Split('''');
string numbersPart = parts.Skip(parts.Count() - 4)
                          .Aggregate((acc, next) => acc + next);

结果:"10000080"

var r = new Regex(@"[^'d+]");
var match = r
    .Split(@"C:'Projects'test'whatever'files'media'10'00'00'80'test.jpg")
    .Aggregate((i, j) => i + j);
return match.ToString();

查找数字可以使用regex:

(([0-9]{2})''){4}

使用concat all inner Group ([0-9]{2})来获取您搜索的号码。

这将总是在给定字符串的任何位置找到您搜索的数字。

示例代码:

static class TestClass {
    static void Main(string[] args) {
        string[] tests = { @"C:'Projects'test'whatever'files'media'10'00'00'80'test.jpg",
        @"C:'Projects'test'whatever'files'media'10'00'00'80'some'foldertest.jpg",
        @"C:'10'00'00'80'test.jpg",
        @"C:'10'00'00'80'test.jpg"};
        foreach (string test in tests) {
            int number = ExtractNumber(test);
            Console.WriteLine(number);
        }
        Console.ReadLine();
    }
    static int ExtractNumber(string path) {
        Match match = Regex.Match(path, @"(([0-9]{2})''){4}");
        if (!match.Success) {
            throw new Exception("The string does not contain the defined Number");
        }
        //get second group that is where the number is
        Group @group = match.Groups[2];
        //now concat all captures
        StringBuilder builder = new StringBuilder();
        foreach (var capture in @group.Captures) {
            builder.Append(capture);
        }
        //pares it as string and off we go!
        return int.Parse(builder.ToString());
    }
}