在字符串中查找包含的字符串并获取它';s的结束索引值
本文关键字:字符串 索引值 结束 串并 查找 包含 字符 获取 | 更新日期: 2023-09-27 18:25:39
我试图在字符串中存储未知数量的特定字符串,但我想获取它的索引,以便再次检查它。例如:
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]
),所以我可以这样做:if(int.TryParse(line[7], num))
如果这个TryParse返回true,它将存储values.Add("/hello/"+line[7]);
"/"后的值不会高于9或负值(例如:/hello/34或/hello/-23)
然后一个辅助字符串就是这个之后的内容:
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";
我会再次进行搜索,但我缺少的是如何获得索引值,所以下次进行搜索时,我的行将是:
" ajhsd asjskjd skj /hello/s sajdk /hello/3 assdsfd hello/4";
在找到并保存"/hello/2"
这看起来是一个使用正则表达式的好地方(我不经常这么说)。例如:
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")
或类似的东西来允许段塞中的所有单词字符。
方法略有不同。看看这是否有帮助-
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
}
}
}
您希望使用String.IndexOf (String, Int32)
而不是Contains()
,因为它可以从特定索引开始获得"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);
}