我正在用C#读取文件。我想从字符串中检查值。该行包括以下内容:
15 EMP_L_NAME HAPPENS 5 TIMES.
40 SUP HAPPENS 12 TIMES.
我想在字符串“TIMES”之前找到字符串中的次数。我写了以下代码:
int arrayLength = 0;
int timesindex = line.IndexOf("TIMES");
if (timesindex > 0)
{
//Positon of the digit "5" in the first line
int indexCount = timesindex - 2;
if (int.TryParse(line.Substring(indexCount, 1), out occursCount))
{
arrayLength = occursCount;
}
}
使用上面的代码,我可以找到单个digigt编号的“TIMES”数。但如果它是一个两位数,它将无法工作(例如第二行)。我必须开发一个逻辑来查找由“TIMES”空格分隔的数字。我怎么能这样做?
答案 0 :(得分:2)
你可以这样做:
像:
string str = "15 EMP_L_NAME HAPPENS 5 TIMES. ";
string[] array = str.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
int index = Array.IndexOf(array, "TIMES.");
int number;
if (!int.TryParse(array[index - 1], out number))
{
//invalid number
}
Console.WriteLine(number);
答案 1 :(得分:0)
如果输入是可靠的,您可以使用String.Split()
...
int arrayLength = 0;
int timesindex = line.IndexOf("TIMES");
if (timesindex > 0)
{
string[] items = line.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries);
if (int.TryParse(items[items.Length - 2], out occursCount))
{
arrayLength = occursCount;
}
}
此方法依赖于所需的数字,即每行中最后一个“单词”的第二个
答案 2 :(得分:0)
如果你的字符串总是相同的格式,只有五个字或"部分"或者你想要称呼它们的任何东西,你可以使用:
int times = 0;
Int32.TryParse(line.Split(' ')[3], out times);
这必须更加健壮,字符串可能不存在,或者字符串的格式完全不同。
答案 3 :(得分:0)
结合您的timesindex
查看LastIndexOf。您可以在前一个空格(timesindex
- 1)之前查找空格,然后在数字周围找到两个位置。
int timesindex = line.IndexOf("TIMES");
int firstSpace = line.LastIndexOf(" ", timesindex-1);
string number = line.Substring(firstSpace, timesindex-firstSpace);
虽然这可能需要对索引进行一些调整,但无论如何这都是想法
答案 4 :(得分:0)
试试这个
int timesindex = line.IndexOf("TIMES");
int happensindex = line.IndexOf("HAPPENS") + 7; //Add 7 cause HAPPEND is 7 chars long
if (timesindex > 0)
{
//Positon of the digit "5" in the first line
if (int.TryParse(line.Substring(happensindex, timesindex).trim(), out occursCount))
{
arrayLength = occursCount;
}
}
答案 5 :(得分:0)
您可以使用System.Text.RegularExpressions.Regex
,即正则表达式,以便在字符串中查找模式:
string input = "40 SUP HAPPENS 12 TIMES.";
Match match = Regex.Match(input, @"(?<=HAPPENS\s)\d+(?=\sTIMES)");
if (match.Success) {
Console.WriteLine(match.Value); '==> "12"
}
正则表达式的说明:它使用通用模式(?<=prefix)find(?=suffix)
来查找前缀和后缀之间的位置。
(?<=HAPPENS\s) Prefix consisting of "HAPPENS" plus a whitespace (\s)
\d+ A digit (\d) repeated one or more times (+)
(?=\sTIMES) Suffix consisting of a whitespace (\s) plus "TIMES"
如果你只想测试“TIMES”而不是“HAPPENS”,你可以放弃第一部分:
Match match = Regex.Match(input, @"\d+(?=\sTIMES)");
由于您多次使用相同的搜索模式,建议您创建一次Regex
而不是调用静态方法:
Regex regex = new Regex(@"\d+(?=\sTIMES)");
// Use many times with different inputs
Match match = regex.Match(input);
答案 6 :(得分:0)
正则表达式会更清洁:
var regex = new Regex(@"(\d+)\sTIMES"); // match a number followed by whitespace then "TIMES"
string num = regex.Match(" 15 EMP_L_NAME HAPPENS 5 TIMES").Groups[1].ToString();
int val = int.Parse(num);
答案 7 :(得分:0)
使用LINQ:
string[] lines = {"15 EMP_L_NAME HAPPENS 5,1 TIMES.", "40 SUP HAPPENS 12 TIMES. "};
var allValues = lines.Select(line =>
{
double temp;
var words = line.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries);
var value = words[Array.IndexOf(words,"TIMES.") - 1];
if (double.TryParse(value, out temp)) return temp;
else return 0;
}).ToList();
foreach (var value in allValues)
{
Console.WriteLine(value);
}
// Output:
// 5,1
// 12