我想解析这个表达式,并取出相关的值,Source[123] = Target[4563] And Source[454543] = Target[983743] Or Source[..] = Target...[]里目前只支持正整数, 表达式之间可以用And或Or连接,我现在想取出[]里的值并放到二维数组里,用regex应该是最好的方案,但我对这不熟悉,还请各位帮忙,谢谢了

解决方案 »

  1.   

    string test = "";
    List<string> list = new List<string>();
    test = Regex.Replace(test, @"\[([^\]]*)\]", new MatchEvaluator(myEvaluator));
    foreach (string s in list)
    {
        TextBox1.Text += s + "\n";
    }
    private string myEvaluator(Match m)
    {
        list.Add(m.Groups[1].Value);
        return "";
    }
      

  2.   

    谢谢你的回复啊,忘了说另外一种情况,
    有可能表达式是 Source[12343] = "abc", 也可能 Target[34332] = 123,
    如果是这种情况,我就得取[]里值并且要知道是Source还是Target,然后取 = 后面的值,它可能是数字,也可能是字符串所以我是希望把它们匹对放入二维数组里,嗯,有点小复杂
      

  3.   

    只取出数字就可以了,还是要Source和Target成对取单独取
    Regex reg = new Regex(@"(?<=\[)\d+(?=\])");
    MatchCollection mc = reg.Matches(yourStr);
    foreach (Match m in mc)
    {
        richTextBox2.Text += m.Value + "\n";
    }
    /*--------输出--------
    123
    4563
    454543
    983743
    */
    成对取
    Regex reg = new Regex(@"(?i)Source\[(\d+)\]\s*=\s*Target\[(\d+)\]");
    MatchCollection mc = reg.Matches(yourStr);
    foreach (Match m in mc)
    {
        richTextBox2.Text += m.Groups[1].Value + "\n";
        richTextBox2.Text += m.Groups[2].Value + "\n--------------------\n";
    }
    /*--------输出--------
    123
    4563
    --------------------
    454543
    983743
    --------------------
    */
      

  4.   

    刚看到3楼的回复
    以下两个例子,看不出有什么规则,分别要取什么?
    Source[123] = Target[4563] And Source[454543] = Target[983743] Or Source[..] = Target...
    Source[12343] = "abc", 也可能 Target[34332] = 123,
      

  5.   

    我就举几个例子
    如果表达式这样,
    Source[123] = Target[4563] And Source[454543] = Target[983743] And Source[12343] = "abc"(Source[123] = Target[4563] Or Source[454543] = Target[983743]) And Target[34332] = 123
    估计这个比较麻烦,我就假设必须按照Source在前出现,Target在后出现的原则吧,那表达式就应该这样,(Source[123] = Target[4563] Or Source[454543] = Target[983743]) And 123 = Target[34332]不清楚的地方请问
      

  6.   

    对于Source[123] = Target[4563] And Source[454543] = Target[983743] And Source[12343] = "abc"我要123,4563 And  454543,983743  And 12343, "abc"对于(Source[123] = Target[4563] Or Source[454543] = Target[983743]) And 123 = Target[34332]我要(123,4563 Or 454543,983743) And "123", 34332如果被引号包括,表示此值是常量或字符串
      

  7.   

    try...string test = @"Source[123] = Target[4563] And Source[454543] = Target[983743] And Source[12343] = ""abc""
    (Source[123] = Target[4563] Or Source[454543] = Target[983743]) And 123 = Target[34332]";
    Regex reg = new Regex(@"(?i)(\(?Source\[(?<src>\d+)\]|(?<src>\S+))\s*=\s*(Target\[(?<tar>\d+)\]|(?<tar>\S+))");
    MatchCollection mc = reg.Matches(test);
    foreach (Match m in mc)
    {
        richTextBox2.Text += m.Groups["src"].Value + "\n";
        richTextBox2.Text += m.Groups["tar"].Value + "\n--------------------\n";
    }
    /*-------输出-------
    123
    4563
    --------------------
    454543
    983743
    --------------------
    12343
    "abc"
    --------------------
    123
    4563
    --------------------
    454543
    983743
    --------------------
    123
    34332
    --------------------
    */
      

  8.   

    try...string test = @"Source[123] = Target[4563] And Source[454543] = Target[983743] And Source[12343] = ""abc""
    (Source[123] = Target[4563] Or Source[454543] = Target[983743]) And 123 = Target[34332]";
    Regex reg = new Regex(@"(?i)(\(?Source\[(?<src>\d+)\]|(?<src>\S+))\s*=\s*(Target\[(?<tar>\d+)\]|(?<tar>\S+))");
    MatchCollection mc = reg.Matches(test);
    foreach (Match m in mc)
    {
        richTextBox2.Text += m.Groups["src"].Value + "\n";
        richTextBox2.Text += m.Groups["tar"].Value + "\n--------------------\n";
    }
    /*-------输出-------
    123
    4563
    --------------------
    454543
    983743
    --------------------
    12343
    "abc"
    --------------------
    123
    4563
    --------------------
    454543
    983743
    --------------------
    123
    34332
    --------------------
    */