0

だから私はこのようなデータを持っています:

((4886.03 12494.89 "LYR3_SIG2"))

常にスペースで区切られるため、正規表現を使用してそれぞれをプロパティに配置したいと考えています。

はい、正規表現で遊んでいました

string q = "4886.03 12494.89 \"LYR3_SIG2";
string clean = Regex.Replace(q, @"[^\w\s]", string.Empty);

しかし、私が目指しているのは、3つの値のそれぞれをこのようなクラスに入れることです

public class BowTies
{
    public double XCoordinate { get; set; }
    public double YCoordinate { get; set; }
    public string Layer { get; set; }
}

今、私はもともとデータをプロパティに解析していました

t = streamReader.ReadLine();
if ((t != null) && Regex.IsMatch(t, "(\\(\\()[a-zA-Z_,\\s\".0-9-]{1,}(\"\\)\\))"))
   currentVioType.Bowtie = new ParseType() { Formatted = Regex.Match(t, "(\\(\\()[a-zA-Z_,\\s\".0-9-]{1,}(\"\\)\\))").Value.Trim('(', ')'), Original = t };

しかし今、私は本当にそのデータをダブルスと文字列に入れたいので、このデータはスペースで区切られています ((4886.03 12494.89 "LYR3_SIG2")) リファクタリングの道を歩み始めましたが、一時的にダブルスを取得するために正規表現を使用していませんでした(これは常に最初の2つの値になり、その後に文字列が続くので、これを始めました:

currentAddPla.Bows.Add(new BowTies() { XCoordinate = 44.33, YCoordinate = 344.33, Layer = Regex.Match(t, "(\\(\\()[a-zA-Z_,\\s\".0-9-]{1,}(\"\\)\\))").Value.Trim('(', ')')});

しかし、私は明らかに正規表現を使用し、これを解析して最初の値をダンプする必要があります(ダブルをXCoordinateに、次に2番目の値をYCoordinateに、3番目の値は正規表現がすでにすべてのデータを取得しており、「LYR3_SIG2」の3番目の値のみを取得する必要があります)どちらが正規表現で見つかるはずですか?

4

2 に答える 2

1

String.SplitRegEx の代わりに使用する必要があります。データは単純にフォーマットされているため、ここでうまく機能したとしても RegEx はやり過ぎです。その上、データを定義する言語は正規のもの ( http://en.wikipedia.org/wiki/Regular_language ) ではないため、正規表現で確実に解析することはできません。括弧内のデータは単純にフォーマットされているため、現在は機能している可能性がありますが、一致する中括弧を持つ言語は文脈に依存せず、通常は正規表現で解析できません。

于 2013-05-09T22:29:30.623 に答える
1

したがって、常にスペースで区切られます

このための正規表現はやり過ぎのように聞こえます。の使用を検討しましたかstring.Split(' ');。たとえば:

string s = "((4886.03 12494.89 \"LYR3_SIG2\"))";
s = s.Replace("(", string.Empty).Replace(")", string.Empty);
string[] arr = s.Split(' ');

currentAddPla.Bows.Add(new BowTies() { 
   XCoordinate = Convert.ToDouble(arr[0]),
   YCoordinate = Convert.ToDouble(arr[1]),
   Layer = arr[3]});
于 2013-05-09T22:28:27.120 に答える