使用Substring在字符串之前获取数字

时间:2014-01-17 17:03:06

标签: c#

我正在用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”空格分隔的数字。我怎么能这样做?

8 个答案:

答案 0 :(得分:2)

你可以这样做:

  • 将您的字符串拆分为空格并删除空的企业。
  • 查找“TIMES。”的索引。
  • 访问元素索引 - 1

像:

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