[英]C# Best solution to get part of string between some text
我有一個像
"[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");
這使我回到全文。
使用System.Text.RegularExpressions.Match
。
Regex.Match
方法返回Match類的一個實例,該實例表示字符串中的第一個模式匹配。 后續匹配由Match.NextMatch
方法返回的Match對象表示。 另外,Regex.Matches
方法返回一個由零個,一個或多個Matc
h對象組成的MatchCollection
對象。...
如果模式匹配成功,則
Value
屬性包含匹配的子字符串,Index
屬性指示輸入字符串中匹配子字符串的從零開始的位置,而Length
屬性指示輸入字符串中匹配子字符串的長度。由於單個匹配項可能涉及多個捕獲組,因此
Match
具有一個Groups
屬性,該屬性返回GroupCollection
。GroupCollection
具有返回每個組的訪問器。Match
繼承自Group
因此可以直接訪問匹配的整個子字符串。 即,Match實例本身等效於Match.Groups[0]
(在Visual Basic中為Match.Groups(0)
)。
我建議修改正則表達式以僅匹配部分輸入並避免多行匹配問題。 文件名子表達式需要同時匹配大小寫字母。
Regex mypattern = new Regex("VARIANT_SETTINGS file ([ ._0-9A-Za-z-]+) successfully generated!");
string filename = mypattern.Match(mytext).Groups[1].Value;
filename
現在應為"1094_002-900208R7.0_05R01 02.hex"
。
一個非常簡單的方法是:
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", "");
您應該使用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
如果經常使用它,則可能要編譯並緩存正則表達式。 模式也可以有所改善,但我會留給您做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.