如何从字符串中获取一些字符

时间:2014-03-11 14:51:08

标签: c# string

我有一个字符串

string str = "2952885619_Table!$1$4";

我想提取值1和4.

我试过

int index =str.IndexOf('$');
if (index > 0)
{
    int rowIndex = Convert.ToInt32(string.Substring(index, index + 1));
    int colIndex = Convert.ToInt32(BookmrkID.Substring(index, index + 3));
}

但它会抛出一个System.ArgumentOutOfRangeException,我不知道为什么。

还有其他方法可以提取这两个值吗?

11 个答案:

答案 0 :(得分:2)

您可以从$开始使用string.Substringstring.IndexOf来获取字符串,然后您可以在$上拆分字符串并删除空条目。这会将14作为字符串值,稍后您可以将它们解析为int,如:

List<int> list = str.Substring(str.IndexOf('$'))
                        .Split(new[] { '$' }, StringSplitOptions.RemoveEmptyEntries)
                        .Select(int.Parse)
                        .ToList();

您的list将包含14作为整数值。

答案 1 :(得分:1)

这是你可以做到的另一种方式:

var splits = str.Split('$');
var rowIndex = splits[1];
var colIndex = splits[2];

答案 2 :(得分:0)

string.Substring调用的第二个参数是长度而不是结束范围。您必须计算项目在字符串中的位置差异:

 if (index > 0){
  int rowIndex = Convert.ToInt32(string.Substring(index, 1));
  int colIndex = Convert.ToInt32(BookmrkID.Substring(index + 2, 1));
}

Doc:http://msdn.microsoft.com/en-us/library/aka44szs(v=vs.110).aspx

答案 3 :(得分:0)

只要您知道只有一个数字,您需要将子字符串的长度(第二个参数)设置为1:

int rowIndex = Convert.ToInt32(str.Substring(index + 1, 1));
int colIndex = Convert.ToInt32(str.Substring(index + 3, 1));

如果您不知道数字位数,则需要做更多工作:

int index1 = str.IndexOf('$');
if (index1 > 0) {
    int index2 = str.IndexOf('$', index1 + 1);
    if (index2 > 0) {
        int rowIndex = Convert.ToInt32(str.Substring(index1 + 1, index2 - index1 - 1));
        int colIndex = Convert.ToInt32(str.Substring(index2 + 1, str.Length - index2 - 1));
    }
}

当然,其他人发布的策略也会有效。

答案 4 :(得分:0)

这里你命名你的变量

string str = "2952885619_Table!$1$4";

在这里你可以在变量string和bookmrkID上调用函数substring

Convert.ToInt32(string.Substring(index, index + 1));

int rowIndex = Convert.ToInt32(str.Substring(index,1));

答案 5 :(得分:0)

overload of string.Substring that takes two arguments描述了它的第二个参数如下:

  

长度

     

输入:System.Int32

     

子字符串中的字符数。

您分别为第二个参数传递了index + 1index + 3,而这两次都应该1 {看到1和{{ 1}} 长度为1个字符。)

答案 6 :(得分:0)

第1步:您可以使用String.Split()功能根据$分隔符拆分字符串。

第2步:您只需忽略分割字符串的第一部分。

试试这个:

string str = "2952885619_Table!$1$4";
var items = str.Split('$');
var item1 = Convert.ToInt32(items[1]);
var item2 = Convert.ToInt32(items[2]);

答案 7 :(得分:0)

你可以选择第一个和最后一个$,只读一个字符(如果数字总是一个字符)

string str = "2952885619_Table!$1$4";
var first = str.IndexOf("$");
var last = str.LastIndexOf("$");
Console.WriteLine(str.Substring(first+1,1));
Console.WriteLine(str.Substring(last+1,1));

实例:http://rextester.com/LOIXZ71902

或者,如果它们的长度可变,则会变得非常复杂:

string str = "2952885619_Table!$1234$4321";
var first = str.IndexOf("$");
var last = str.LastIndexOf("$");
Console.WriteLine(str.Substring(first+1,last-(first+1)));
Console.WriteLine(str.Substring(last+1));

实例:http://rextester.com/VFDOP75481

答案 8 :(得分:0)

你可以试试这个:

var list = str.Split('$');
int rowIndex = int.Parse(list[1]);
int columnIndex = int.Parse(list[2]);

答案 9 :(得分:0)

这是另一个单线程,即使字符串不包含$也是安全的:

string[] values = str.Substring(str.IndexOf('$') + 1).Split('$');

将它们转换为int[]的最快方式(无需验证):

int[] intValues = Array.ConvertAll(values, int.Parse);

验证:

int i;
int[] intValues = values
    .Where(v => int.TryParse(v, out i))
    .Select(v => i)
    .ToArray();

答案 10 :(得分:0)

如果您尝试匹配模式(您似乎是这样),您可以使用RegEx轻松解决此问题。

下面的单元测试(NUunit)找到模式美元符号+数字+美元符号+数字。得到所有匹配的结果,并在括号中包含数字部分 \ d + ,您可以在结果参数中提供的集合中访问它们#34;匹配&#34;。

有关RegEx的更多信息:Regular Expression Language - Quick Reference

希望这有帮助!

    [Test]
    public void Find_index_in_string()
    {
        // Arrange
        const string str = "2952885619_Table!$1$4";

        // Act
        var matches = Regex.Matches(str, @"\$(\d+)\$(\d+)");

        // Assert
        Assert.That(matches.Count, Is.EqualTo(1));
        Assert.That(matches[0].Groups[0].ToString(), Is.EqualTo("$1$4"));
        Assert.That(matches[0].Groups[1].ToString(), Is.EqualTo("1")); // Extracted index 1
        Assert.That(matches[0].Groups[2].ToString(), Is.EqualTo("4")); // Extracted index 2
    }