嗨我有一个字符串结果如下。
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");
}
}
答案 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
,然后突然查看第一行