使用正则表达式从字符串中获取子字符串

时间:2016-07-15 19:43:29

标签: c# 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));

但我想知道怎样才能用正则表达式做到这一点。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

首先,让我们详细说明匹配的规则数字不是你想得到的):

  • 以'_'开头(不包含在比赛中)
  • 包含数字和点(点不会重复)。
  • 不允许前导,也不允许使用尾随点
  • 至少有一位数字以及至少一个点
  • 以'。'结尾(不包括在比赛中)

然后实现一个模式:

 (?<=_)[0-9]+(\.[0-9]+)+(?=\.)

如果问题中的数字实际上是某种版本,您可能想要重写其部分的数量,例如

 (?<=_)[0-9]+(\.[0-9]+){1,3}(?=\.[^0-9])

表示只接受2到4个版本(_d.d._d.d.d._d.d.d.d.)。例如。当_1.2.15.被拒绝时,将接受输入1(3个部分:215_1.2.3.4.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是更好的选择。

答案 1 :(得分:2)

只要您要查找的数字前面带有“_”,此代码就可以正常工作。

已编辑 - 这是最终的工作结果

        // 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();

答案 2 :(得分:1)

你已经得到了所有答案。 我在过去的6个月里没有练习,几乎都忘记了。 无论如何,有很多网站(在你最喜欢的搜索引擎中寻找正则表达式测试器)可以帮助你使用正则表达式。我不知道我是否可以提到一个比另一个更多但是这里有一个例子的快照(我不是正则表达式的最新专家所以我希望我没有写错的东西)。

enter image description here enter image description here enter image description here enter image description here

所以现在你可以测试所有给你的答案和建议。