[英]Get a substring from a string using regex
我有許多這種格式的字符串:
fdg.sdfg.234fdsa.dsf_1.2.5.62.xml
23432ssdfsa_sadfsd_1.2.7.6.xml
3.3.3asdf_ddd_1.2.1.doc
我只想得到一個數字
從: fdg.sdfg.234fdsa.dsf_1.2.5.62.xml
獲取: 1.2.5.62
從: f23432ssdfsa_sadfsd_1.2.7.6.xml
獲取: 1.2.7.6
從: f3.3.3asdf_ddd_1.2.1.doc
獲取: 1.2.1
等等
此代碼有效:
string test = "4534534ghgggg_1.1.3.4.xml";
int to = test.LastIndexOf('.');
int from = test.LastIndexOf('_') + 1;
Console.WriteLine(test.Substring(from,to - from));
但是我想知道如何使用正則表達式。 有任何想法嗎?
首先,讓我們詳細說明匹配的規則 ( 數字不是您想要獲得的):
然后實現一個模式:
(?<=_)[0-9]+(\.[0-9]+)+(?=\.)
如果問題中的數字實際上是某種版本,則可能需要限制其部分的數字,例如
(?<=_)[0-9]+(\.[0-9]+){1,3}(?=\.[^0-9])
這意味着僅接受2到4個零件版本( _d.d.
, _d.dd
和_d.ddd
)。 例如輸入_1.2.15.
將被接受(3份: 1
, 2
和15
),當_1.2.3.4.5.
將被拒絕(5部分)
最后,使用正則表達式:
string source = ...
string pattern = @"(?<=_)[0-9]+(\.[0-9]+)+(?=\.)";
// If there are many matches, let's take the last one
string lastMatch = Regex.Matches(pattern, source)
.OfType<Match>()
.Select(match => match.Value)
.LastOrDefault();
Console.Write(lastMatch);
但是,如果格式是固定的,則正則表達式 (和Linq )會過沖。 LastIndex
+ Substring
是更好的選擇。
只要您要查找的數字前面帶有“ _”,此代碼就可以正常工作。
編輯-這是最終的工作結果
// fdg.sdfg.234fdsa.dsf_1.2.5.62.xml
// 23432ssdfsa_sadfsd_1.2.7.6.xml
// 3.3.3asdf_ddd_1.2.1.doc
string source = "fdg.sdfg.234fdsa.dsf_1.2.5.62.xml";
var match = Regex.Match(source, @"_[0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+)*").ToString().Replace("_", "");
Console.WriteLine(match);
Console.ReadLine();
您已經得到了所有答案。 我過去六個月沒有練習過,幾乎都忘了。 無論如何,有很多網站可以幫助您使用正則表達式(在您最喜歡的搜索引擎中尋找正則表達式測試器)。 我不知道我能否比其他人提更多,但是這里是一個示例的快照(我不是regex的最新專家,所以我希望我寫的東西不太錯)。
因此,現在您可以測試提供給您的所有答案和建議。 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.