0

シリアル ポート通信を介して文字列でデータを受信して​​います。その部分はうまく機能しています。データの形式は次のとおりです。

Distance run: 36in.
Direction in degrees: 275

Total of person founds:11
New Person found in:
Lat/Long: 18.38891, -66.12174
Date: 5/4/2013  Time: 19:13:35.0

Total of person founds:12
New Person found in:
Lat/Long: 18.38891, -66.12175
Date: 5/4/2013  Time: 19:13:37.0


Distance run: 15in.
Direction in degrees: 215

Total of person founds:13
New Person found in:
Lat/Long: 18.38891, -66.12174
Date: 5/4/2013  Time: 19:13:39.0


Distance run: 30in.
Direction in degrees: 180

しかし、これは、発見された人の各ブログ (緯度/経度、日付と時刻の位置を含む) の間で少し異なる可能性があります。

正規表現を試しましたが、うまく使用する方法がわかりません。数字だけを抽出する正規表現もあります。

var xnumbers = Regex.Split(strFileName, @"[^0-9\.\-]+").Where(c => c != "." && c.Trim() != "");

私が望むのは、たとえば距離走行の特定の値を抽出することです。最初の値は36インチで、それを保存するなどです。次に、方向の値を度で取得して別の変数に保存し、最後に緯度と経度を取得して別の変数に保存します。後でそのデータを使用してプロットするためのリストを作成するには、この値が必要です。私はすでに描画部分を持っています。

私はこれを試しました:

このパターンは、距離が 2 つの数値のみであるが、その値は 1 つまたは 3 つの数値である可能性があることのみを考慮していることを知っています (例: 走行距離: 1 インチまたは走行距離: 219 インチ)

string pattern = @"^Distance Run:(?<distance>.{2}),Direction in degrees:,(?<degress>. {3}),Lat/Long:(\+|\-)(?<latlong>.{18})$";

string distance = string.Empty;
string degrees = string.Empty;
string latlong = string.Empty;


Regex regex = new Regex(pattern);

if (regex.IsMatch(strFileName)) // strFileName is the string with the data
{
    Match match = regex.Match(strFileName);
    foreach (Capture capture in match.Groups["distance"].Captures)
        distance = capture.Value;
    foreach (Capture capture in match.Groups["degree"].Captures)
        degrees = capture.Value;
    foreach (Capture capture in match.Groups["Lat/Long"].Captures)
        latlong = capture.Value;
}

しかし、機能していません。助けやアドバイスをいただければ幸いです。前もって感謝します。

4

2 に答える 2

2

内で 2 つの値を渡すことにより、変数の繰り返しを定義できます。{}たとえば、\d{1,3}1 ~ 3 桁に一致します。

しかし、全体的には、形式が解析しやすいので、これにはおそらく正規表現をあまり使用しません。

  • まず、すべての行を文字列の配列としてループします。
  • 1 行が空の場合は無視し、連続する 2 行が空の場合は、新しいデータセットが作成されます。
  • 行に aが含まれている:場合は、そこで行を分割します。左側の部分がキーになり、右側の部分が値になります。
  • 行に a が含まれていない場合は、:無視されるか、エラー フラグが発生します (または例外がスローされます)。
  • 次に、単純な文字列一致 (正規表現よりも高速) を使用して、「キー」の意味を判断できます。
  • 次に、別の正規表現 (または のようなものDouble.Parse()) が右側から値を抽出します。これらの変換関数は単に無効な文字をスキップし、その後に続くものをすべて削除することに注意してください。
  • より複雑なエントリ (座標やタイム スタンプ、または単位が重要なエントリなど) は、単純な正規表現を使用して解析できます。

簡略化されたコード (必ずしも 100% コンパイル可能/正しいとは限りません):

String[] lines = fileContents.Split({'\n'}); // split the content into separate lines

bool wasEmpty = false;
foreach (String line in lines) {
    line = line.Trim(); // remove leading/trailing whitespaces
    if (line.Length == 0) { // line is empty
        if (wasEmpty) { // last line was empty, too
            // init a new dataset
        }
        else
            wasEmpty = true;
        continue; // skip to next entry
    }
    wasEmpty = false;
    String content = line.split({':'}); // split the line into a key/value pair
    if (content.Length != 2) // not exactly two entries
        continue; // skip
    // content[0] now has the "key" (like "Lat/Long")
    // content[1] now has the "value" (like "18.38891, -66.12175")
    // both can be evaluated using regular expressions
}
于 2013-05-05T20:35:42.777 に答える