尝试从字符串中提取代码

4

我正在尝试从字符串中提取代码。字符串的内容和大小可能会有所变化,但我使用标签词来使提取更加容易。然而,我无法解决特定情况。以下是字符串:

({GoldPrice} * 0.376) + {MP.011} + {SilverPrice}

我需要提取的是{MP.011}中的011部分。关键词总是“{MP.”,只是代码会改变。此外,表达式的其余部分可能会改变,因此例如{MP.011}可以在字符串的开头、结尾或中间。

使用以下内容我已经接近了目标:
        int pFrom = code.IndexOf("{MP.") + "{MP.".Length;
        int pTo = code.LastIndexOf("}");
        String result = code.Substring(pFrom, pTo - pFrom);

然而,结果是011} + {SilverPrice,因为它正在寻找}的最后一次出现,而不是下一次出现。这就是我所遇到的困难。
非常感谢您的帮助。

它总是在“MP。”之后三个字符吗? - KidBilly
2
C# 不是我的强项,但你能不能只是循环遍历字符串从 pFrom 开始,并在遇到 } 时停止呢? - Nick Dima
4个回答

4
您可以使用正则表达式来解析它:
var str = "({GoldPrice} * 0.376) + {MP.011} + {SilverPrice}";
var number = Regex.Match(str, @"{MP\.(\d+)}")
    .Groups[1].Value;
Console.WriteLine(number);

3
        int pFrom = code.IndexOf("{MP.") + "{MP.".Length;
        int pTo = code.IndexOf("}", pFrom); //find index of } after start
        String result = code.Substring(pFrom, pTo - pFrom);

1
最安全的选择是使用具有负向和正向先行断言的正则表达式。如果需要的话,这也可以匹配多个。
  var str3 = @"({GoldPrice} * 0.376) + {MP.011} + {SilverPrice}";
  var result = Regex.Matches(str3, @"(?<=\{MP\.).+?(?=\})");

  foreach (Match i in result)
  {
      Console.WriteLine(i.Value);
  }

谢谢Simonare。然而,这似乎没有返回匹配的结果? - DarrenL
感谢更新。现在它可以给出结果,但它不能处理代码的变化,实际上在MP之后可以是任何内容。这里是字符串的更新示例:({GoldPrice} * 0.376) + {MP.011M} + {SilverPrice} + {MP.013M} - DarrenL
嗨,Simonare,进展不错!现在的结果是011M} + {SilverPrice} + {MP.013M,但应该有两个结果“011M”和“013M”。您能否进行相应的修改? - DarrenL
如果您认为这个答案有用,请考虑点赞或将其标记为答案。谢谢。 - Derviş Kayımbaşıoğlu

0
关键是使用 .IndexOf(string text,int start) 重载。
static void Main(string[] args)
{
    string code = "({GoldPrice} * 0.376) + {MP.011} + {SilverPrice}";

    // Step 1. Extract "MP.011"
    int pFrom = code.IndexOf("{MP.");
    int pTo = code.IndexOf("}", pFrom+1);
    string part = code.Substring(pFrom+1, pTo-pFrom-1);
    // Step 2. Extact "011"
    String result = part.Substring(3);
}

或者您可以将最后的语句组合成一个

    String result = code.Substring(pFrom+1, pTo-pFrom-1).Substring(3);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接