在字符串中查找包含的字符串并获取它的结束索引值

时间:2014-10-05 07:18:08

标签: c# string

我正在尝试在字符串中存储未知数量的特定字符串,但我想获取它的索引,以便我可以再次检查它。例如:

List<string> values = new List<string>();
int num;
string line = "/hello/1 /a/sdhdkd asjs /hello/2 ajhsd asjskjd skj /hello/s sajdk /hello/3 assdsfd hello/4";

我想存储:/hello/1/hello/2/hello/3/hello/4但不是hello / s,因为它在字符串列表中是不同的模式(非数字)但是我不知道怎么......

我的想法是这样的:

//检测它们之间的共同模式

if(line.Contains("/hello/")

我如何知道“/ hello /”中的最后一个“/”的位置(在line line[6]中),所以我可以这样做:{{1} }

如果此TryParse返回true,则会存储if(int.TryParse(line[7], num)) “/”后面的值不会高于9或负数(例如:/ hello / 34或/ hello / -23)

然后一个辅助字符串将是这样的:

values.Add("/hello/"+line[7]);

现在,行是:

string aux = "";
for(int i=index_value; i<line.Length; i++) aux+= line[i]; //Where index_value would be 7+1
line = aux;

我将再次进行搜索,但我缺少的是如何获取该索引值,以便下次进行此搜索时,我的行将是:

" /a/sdhdkd asjs /hello/2 ajhsd asjskjd skj /hello/s sajdk /hello/3 assdsfd hello/4";

找到并保存“/ hello / 2”

3 个答案:

答案 0 :(得分:0)

这看起来像是一个使用正则表达式的好地方(而且这不是我经常说的)。例如:

using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main(string[] args)
    {
        var regex = new Regex(@"/hello/\d+\b");
        var text = "/hello/1 /a/sdhdkd asjs /hello/2 ajhsd " 
            + "asjskjd skj /hello/s sajdk /hello/3 assdsfd hello/4";

        foreach (Match match in regex.Matches(text))
        {
            Console.WriteLine("{0} at {1}", match.Value, match.Index);
        }
    }
}

输出:

/hello/1 at 0
/hello/2 at 24
/hello/3 at 66

(否hello/4,因为它没有前导斜杠。)

如果hello不应该被硬编码,您可以使用new Regex(@"/\w+/\d+\b")或类似内容来允许该段中的所有单词字符。

答案 1 :(得分:0)

略有不同的方法。看看这是否有帮助 -

string line = "/hello/1 /a/sdhdkd asjs /hello/2 ajhsd asjskjd skj /hello/s sajdk /hello/3 ";
string[] lineParts = line.Split(' ');

int helloPartIndex;
int helloSuffix;
foreach (string linePart in lineParts)
{
      if (linePart.StartsWith("/hello/"))
      {
           helloPartIndex = line.IndexOf(linePart); //This is the index of the part in the entire line
           string[] helloParts = linePart.Split('/');
           if(helloParts != null && helloParts.Length >0)

           if (int.TryParse(helloParts[2], out helloSuffix))
           {
                  // Do stuff when the hello suffix is integer
           }
           else
           {
                 // This is where you have to deal with /hello/s and so on
           }
      }
}

答案 2 :(得分:0)

而不是Contains(),您希望使用String.IndexOf (String, Int32),因为它可以从特定索引开始获取“Hello /”索引。我们的想法是跟踪当前的指数并逐步推进。

void Main()
{   
    var line = @"/hello/1 /a/sdhdkd asjs /hello/2 ajhsd 
               asjskjd sk /hello/s sajdk /hello/3 assdsfd hello/4";
    var searchString = "/hello/";
    var index = 0;

    var values = new List<int>();

    while(index < line.Length && 
         (index = line.IndexOf(searchString, index)) != -1)
    {
        index += searchString.Length;
        if(index < line.Length &&
           Char.IsDigit(line[index]))
            values.Add((int)(line[index] - '0'));
    }   

    Console.WriteLine(values);
}