从字符串中提取和打印数据

时间:2017-07-31 06:49:10

标签: c#

嗨我有一个字符串结果如下。

String result= 
>TxData: 7C,0,7A,10,0,0,4,0,0,0,7B,50,0,0,0,0,0,0,0,0,0,0,0,0\r\n\t
>RxData: 4A,4A,4A,4A,4A,4A,4A,4A,4A,4A,4A,4A,7C,0,*7A*,2D,80,0,*7B*,0,4A,4A,4A,4A\r\n" 

我只想检查字符串是否包含 RxData 。遍历那条直到找到7A和7B。我想获取这两个字符之间的数据。 我编写了一个代码但是搜索TXdata行的数据。 我知道如何获得7A和7B之间的数据。 如何仅遍历 rxdata行而不遍历tx数据行。

我使用方法索引来获取7a和7b的索引。有了它,我就可以在它们之间提取数据。 此代码遍历tx数据行。我只想要rx数据线。

if (result.Contains("RxData: "))
{
    foreach (byte word in result)
    {
        index1 = result.IndexOf("7A");
        index2 = result.IndexOf("7B");
    }
}

5 个答案:

答案 0 :(得分:3)

  

如何仅遍历rxdata行而不遍历tx数据行。

从字符串中写入RxData的位置开始,并使用String.SubString方法拉出字符串的其余部分。

String result =
     "> TxData: 7C,0,7A,10,0,0,4,0,0,0,7B,50,0,0,0,0,0,0,0,0,0,0,0,0\r\n\t"+
     " > RxData: 4A,4A,4A,4A,4A,4A,4A,4A,4A,4A,4A,4A,7C,0,*7A *,2D,80,0,*7B *,0,4A,4A,4A,4A\r\n";

if (result.Contains("RxData"))
{
    int start = result.IndexOf("RxData");
    string rxDataString = result.Substring(start, result.Length - start);
}
  

我想获取这两个字符之间的数据。

你可以找到2个索引并再次使用String.SubString方法在任何循环之间拉出字符串:

start = rxDataString.IndexOf("7A");     
int end = rxDataString.IndexOf("7B");

string dataInBetween = rxDataString.Substring(start, end-start);

修改

这个循环永远不会编译! :

foreach (byte word in result)
{
    index1 = result.IndexOf("7A");
    index2 = result.IndexOf("7B");
}

在迭代string时,每个元素都是char!不是byte
这个循环也没有多大意义,因为IndexOf将遍历整个字符串以查找索引。在你的情况下,你会寻找索引n次!运行时为O(n²)

您应该获取索引一次,拉动子字符串然后可以使用Split(' ')将元素放入数组(取决于您的目标)。然后迭代它们是有意义的。

答案 1 :(得分:1)

你应该拆分字符串。如果行结尾相同,则可以使用

var lines = result.Split(\r\n\t);

您还可以检查切口是否包含“RxData:”

for(i = 0; i < lines.length; i++)
{
    if (lines[i].Contains("RxData: "))
       {
          foreach (byte word in result[1])
          {
               index1[i] = lines[i].IndexOf("7A");
               index2[i] = lines[i].IndexOf("7B");
          }
       } 
}

答案 2 :(得分:1)

您可以在新行拆分字符串并迭代返回的数组:

var lines = result.Split("\r\n\t");
var rxData = lines.FirstOrDefault(x => c.Contains("RxData"));
if(rcData != null)
{
    ...
}

答案 3 :(得分:1)

要获取这两个值之间的数据(子串),您可以使用许多不同的方式。

正如其他一些答案所示,您可以使用IndexOf IndexOf有一个重载,可以查看起始索引。因此,如果您拥有RxData索引,则可以将其用作indexOf

的起始位置

所以选项1是:

int rxIdx = result.IndexOf("RxData");
int idx_7A = result.IndexOf("7A", rxIdx);
int idx_7B = result.IndexOf("7B", rxIdx);
string myData = result.Substring(idx_7A, idx_7B - idx_7A + 2); // Including 7A and 7B
string myData = result.Substring(idx_7A + 3,  idx_7B - idx_7A - 4); // Excluding 7A and 7B

选项2使用带有捕获组的简单RegEx:

string myData2 = Regex.Match(result, "(?<=RxData).*(?<RESULT>7A.*7B)")
                      .Groups["RESULT"]
                      .Value; // Including 7A and 7B

string myData2 = Regex.Match(result, "(?<=RxData).*7A,(?<RESULT>.*),7B")
                      .Groups["RESULT"]
                      .Value; // Excluding 7A and 7B

您可以在此处看到它:https://regex101.com/r/QIrmBn/2

答案 4 :(得分:0)

那个没有indexOfs的单行程怎么样?它得到7A和7B之间的字符

String result =
    @"> TxData: 7C,0,7A,10,0,0,4,0,0,0,7B,50,0,0,0,0,0,0,0,0,0,0,0,0\r\n\t
      > RxData: 4A,4A,4A,4A,4A,4A,4A,4A,4A,4A,4A,4A,7C,0,*7A *,2D,80,0,*7B *,0,4A,4A,4A,4A\r\n";

string firstLimiter = "7A";
string secondLimiter = "7B";

var answer = string.Join("",
    Regex.Match(
        Regex.Match(result, ".+RxData.+" + firstLimiter + ".+" + secondLimiter + ".+").Value, 
        firstLimiter + ".+" + secondLimiter)
    .Value
    .Skip(2)
    .Reverse()
    .Skip(2)
    .Reverse()
);

如果answer被反转,那么最后再次反转。 您可以将RxData替换为TxData,然后突然查看第一行