簡體   English   中英

使用正則表達式從字符串中獲取子字符串

[英]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份: 1215 ),當_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM