0

所以我有这样的数据:

((4886.03 12494.89 "LYR3_SIG2"))

它总是以空格分隔,因此我想使用正则表达式将每个放入一个属性中。

是的,我在玩一些正则表达式

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

但我的目标是将这三个值中的每一个都放入这样的类中

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,然后第二个值到 YCoordinate 和正则表达式已经获取所有数据的第三个值,只需要获取“LYR3_SIG2”的第三个值应该用正则表达式找到哪个?

4

2 回答 2

1

它总是以空格分隔,因此

RegEx 听起来有点矫枉过正。您是否考虑过使用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 回答
1

您应该只使用String.Split而不是 RegEx。数据的格式很简单,即使 RegEx 在这里运行良好,它也会显得过大。最重要的是,定义数据的语言不是规则的(http://en.wikipedia.org/wiki/Regular_language),因此无法使用 RegEx 可靠地解析。它现在可能正在工作,因为括号内的数据被简单地格式化,但是具有匹配大括号的语言是上下文无关的,并且通常无法用正则表达式解析。

于 2013-05-09T22:29:30.623 回答