C#在一些文本之间获取字符串的一部分的最佳解决方案

时间:2010-09-24 10:01:11

标签: c# regex

我有一个像

这样的字符串
"[echo]\r\n[echo] Building VARIANT_SETTINGS 05...\r\n[echo] VARIANT_SETTINGS file 1094_002-900208R7.0_05R01 02.hex successfully generated!\r\n"

如何获得1094_002-900208R7.0_05R01 02.hex

我试图通过Regex.Replace做到这一点,但我不明白它是如何发生的。我试过了

fileName = Regex.Replace(hexOutInfo, @"^.*VARIANT_SETTINGS file ([ ._0-9a-z-]+) successfully generated!.*$", "$1");

这让我回想起全文。

3 个答案:

答案 0 :(得分:3)

使用System.Text.RegularExpressions.Match

  

匹配类的实例由Regex.Match方法返回,表示字符串中的第一个模式匹配。后续匹配由Match.NextMatch方法返回的Match对象表示。此外,MatchCollection方法返回由零个,一个或多个Matc h对象组成的Regex.Matches对象。

     

...

     

如果模式匹配成功,则Value属性包含匹配的子字符串,Index属性指示输入字符串中匹配的子字符串从零开始的起始位置,以及{{1 property表示输入字符串中匹配的子字符串的长度。

     

由于单个匹配可能涉及多个捕获组,Length具有返回Match的{​​{1}}属性。 Groups具有返回每个组的访问者。 GroupCollection继承自GroupCollection,因此可以直接访问匹配的整个子字符串。也就是说,Match实例本身等同于Match(Visual Basic中的Group)。

我建议修改正则表达式以仅匹配输入的一部分并避免多行匹配问题。 filename子表达式需要匹配大写和小写字母。

Match.Groups[0]

Match.Groups(0)现在应为Regex mypattern = new Regex("VARIANT_SETTINGS file ([ ._0-9A-Za-z-]+) successfully generated!"); string filename = mypattern.Match(mytext).Groups[1].Value;

答案 1 :(得分:1)

一种非常简单的方法是:

        string hexOutInfo = "[echo]\r\n[echo] Building VARIANT_SETTINGS 05...\r\n[echo] VARIANT_SETTINGS file 1094_002-900208R7.0_05R01 02.hex successfully generated!\r\n";

        string leftCrop = hexOutInfo.Replace("[echo]\r\n[echo] Building VARIANT_SETTINGS 05...\r\n[echo] VARIANT_SETTINGS file ", "");
        string hexFileName = leftCrop.Replace(" successfully generated!\r\n", "");

答案 2 :(得分:0)

您应该使用Regex.Match。这是一个快速而肮脏的解决方案

var str = "[echo]\r\n[echo] Building VARIANT_SETTINGS 05...\r\n" +
          "[echo] VARIANT_SETTINGS file 1094_002-900208R7.0_05R01 02.hex " + 
          "successfully generated!\r\n"

var match = Regex.Match(str, @".*\sfile\s(?<name>.*\.hex)\s.*");
Console.WriteLine(match.Groups["name"].Value);

输出

1094_002-900208R7.0_05R01 02.hex

如果你经常使用它,你可能想要编译和缓存正则表达式。这种模式也可以有所改善,但我会留给你做的。