我有一个像
这样的字符串"[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");
这让我回想起全文。
答案 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
如果你经常使用它,你可能想要编译和缓存正则表达式。这种模式也可以有所改善,但我会留给你做的。