获取字符串的子字符串

时间:2011-02-10 02:07:12

标签: c# string substring

我有一个格式

的字符串
[00:26:19] Completed 80000 out of 500000 steps  (16%)

我希望从中得到16部分。

我应该搜索(然后获取%并获取其间的部分,还是设置正则表达式查询更明智?

4 个答案:

答案 0 :(得分:6)

RegEx可能会成为趋势,但我个人认为没有充分的理由。

话虽如此,这应该有效:

String s = "[00:26:19] Completed 80000 out of 500000 steps  (16%)";
Int32 start = s.LastIndexOf('(') + 1;
Console.WriteLine(s.Substring(start,s.LastIndexOf('%')-start));

如果您认为有必要,可以Convert.ToInt32()

答案 1 :(得分:5)

我会使用这样的正则表达式:

  

([^%]+)%\)$

此表达式允许捕获非数字数据 - 如果您确定括号内的文本以及百分比左侧总是是一个数字,您可以简化表达式对此:

  

(\d+)%\)$

答案 2 :(得分:2)

另一种快速方式是......

        string s = "[00:26:19] Completed 80000 out of 500000 steps  (16%)";
        string res = s.Split("(%".ToCharArray())[1];

这假设我们只会在字符串中看到'('和'%'一次

答案 3 :(得分:1)

这取决于您对输入字符串(“haystack”)的预期变量,以及您对目标模式(“指针”)的预期变量。正则表达式在描述一个很大程度上未知的干草堆中的整类针时非常有用,但它们不是非常静态格式的输入的正确工具。

如果您知道您的字符串将始终如下:

"[A:B:C] Completed D out of E steps (F%)"

其中1)A-F是唯一的可变部分,2)A-F总是数字,那么你只需要一点点字符串操作:

int GetPercentage(string str)
{  
    return int.Parse(
        str.Substring(
            str.IndexOf('(') + 1, 
            str.IndexOf('%') - str.IndexOf('(')
        )
    );
}

这里的关键问题是:“(%的存在是否足以表明我想要捕获的子串?”也就是说,它们只会出现在那个位置吗?如果干草堆的其余部分可能在某处包含(%,我会使用正则表达式:

@"(?<=\()\d+(?=%\)))$"