我正在创建一个Windows窗体应用程序,但我遇到了一个问题。我正在从串口读取数据。
string RxString = serialPort1.ReadExisting();
这很好但我现在要做的是从我的RxString
中提取值并将它们放入自己的字符串数组中。
这是RxString格式:
GPS:050.1347,N,00007.3612,WMAG:+231\r\n
它重复自身,因为从串口添加的数据越多,数字就会改变,但保持相同的长度,+变为 - 。我想把GPS:和N之间的数字放在一个字符串数组中,N之间的数字,和另一个字符串数组中的W,最后是第三个字符串数组中+和\ r \ n之间的数字。
我将如何做到这一点?
答案 0 :(得分:3)
好的,正则表达式解决方案:
string pattern = @"^GPS:(?<gps>.{8}),N,(?<n>.{10}),WMAG:(\+|\-)(?<wmag>.{3})\\r\\n$";
string gps = string.Empty;
string n = string.Empty;
string wmag = string.Empty;
string input = @"GPS:050.1347,N,00007.3612,WMAG:+231\r\n";
Regex regex = new Regex(pattern);
if (regex.IsMatch(input))
{
Match match = regex.Match(input);
foreach (Capture capture in match.Groups["gps"].Captures)
gps = capture.Value;
foreach (Capture capture in match.Groups["n"].Captures)
n = capture.Value;
foreach (Capture capture in match.Groups["wmag"].Captures)
wmag = capture.Value;
}
Console.Write("GPS: ");
Console.WriteLine(gps);
Console.Write("N: ");
Console.WriteLine(n);
Console.Write("WMAG: ");
Console.WriteLine(wmag);
Console.ReadLine();
答案 1 :(得分:1)
试试这个:
string RxString = serialPort1.ReadExisting();
string latitude = RxString.Split(',')[0].Substring(4);
string longitude = RxString.Split(',')[2];
string mag = RxString.Split(',')[3].Substring(6).Trim();
答案 2 :(得分:0)
如果字符串的长度始终相同,最好的方法是使用substring()
方法。
答案 3 :(得分:0)
我确定有一些RegEx可以让这个更漂亮,但我对正则表达式并不擅长,所以我会检查C#的String.Split函数。如果您知道数字的长度相同,则子串将起作用,但如果这不是保证,那么Split将是您最好的选择。 您可以在逗号上分割每一行,创建一个数组,然后使用Replace删除额外的文本(如GPS:和WMAG :),如果您知道每次都是相同的。
答案 4 :(得分:0)
这不是最佳解决方案,因为它使用“魔术”数字和子串 - 但可能适用于您的情况,因为您说字符串长度始终相同。
var serialPortInfo = "GPS:050.1347,N,00007.3612,WMAG:+231\r\n";
private List<string> value1 = new List<string>();
private List<string> value2 = new List<string>();
private List<string> value3 = new List<string>();
private void populateValues(string s)
{
// this should give an array of the following:
// values[0] = "050.1347"
// values[1] = "N"
// values[2] = "00007.3612"
// values[3] = "WMAG:+231"
//
var values = (s.Substring(4, (s.Length - 8))).Split(',');
// populate lists
//
value1.Add(values[0]);
value2.Add(values[2]);
value3.Add(values[3].Substring(6, 3));
}
//usage
populateValues(serialPortInfo);