如何在第一个字母后删除所有内容

时间:2018-03-24 15:07:57

标签: c# regex substring

我正试图从HML链接中获取版本号。

以此为例

firefox-10.0.2.bundle

我已经把它带到-之后的所有内容

string versionNum = name.Split('-').Last();
versionNum = Regex.Replace(versionNum, "[^0-9.]", "");

,它为您提供

的输出
  

10.0.2

但是,如果链接是这样的

firefox-10.0.2.source.tar.bz2

输出看起来像

  

... 10.0.2 2

我怎样才能让它在第三个.之后切掉所有东西?或者我可以这样做,以便在检测到第一个字母时切断它以及随后的所有内容吗?

4 个答案:

答案 0 :(得分:5)

您可以使用单个正则表达式匹配来解决此问题。 这是一个例子:

using System;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        Regex regex = new Regex(@"\d+.\d+.\d+");
        Match match = regex.Match("firefox-10.0.2.source.tar.bz2");
        if (match.Success)
        {
            Console.WriteLine(match.Value);
        }
    }
}

答案 1 :(得分:1)

将“firefox-10.0.2.source.tar.bz2”拆分为“10.0.2.source.tar.bz2”后

string a = "10.0.2.source.tar.bz2";
string[] list = a.Split(new char [] { '.' });
string output = ""
foreach(var item in list)
{
    if item is integer then // try to write this part
        output += item + ".";


}
after that remove the last character from output.

答案 2 :(得分:1)

虽然很晚,我觉得这个答案会更贴切:

var arrayOfObjects = [{0: item1}, {1: item2}, {2: item3}];

改进 -

虽然Regex r = new Regex(@"[\d\.]+(?![a-zA-Z\-])"); Match m = r.Match(name); Console.WriteLine(m.Value); 的答案有效,但如果构建为@Samuel会怎样?他的正则表达式会给10.2.2.3 - 部分答案,因此是错误的。

通过我发布的正则表达式,匹配将完成。

说明 -

10.2.2会匹配数字和点的所有组合,例如[\d\.]+,如果构建为10.2.2.34.56.78

,则只会10

10.bundle是一种否定的预测,可确保匹配后面没有任何字母或短划线。

健壮对任何代码都是至关重要的,所以我发布的答案应该在任何情况下都能很好地工作(因为链接可以是任何代码)。

答案 3 :(得分:1)

这是一个可以处理输入字符串中1-4个数字(不仅仅是数字)的版本,并返回一个版本号:

public static Version ExtractVersionNumber(string input)
{
    Match match = Regex.Match(input, @"(\d+\.){0,3}\d+");
    if (match.Success)
    {
        return new Version(match.Value);
    }
    return null;
}

void Main()
{
    Console.WriteLine(ExtractVersionNumber("firefox-10.source.tar.bz2"));
    Console.WriteLine(ExtractVersionNumber("firefox-10.0.source.tar.bz2"));
    Console.WriteLine(ExtractVersionNumber("firefox-10.0.2.source.tar.bz2"));
    Console.WriteLine(ExtractVersionNumber("firefox-10.0.2.5.source.tar.bz2"));
    Console.WriteLine(ExtractVersionNumber("firefox-10.0.2.5.6.source.tar.bz2"));
    Console.WriteLine(ExtractVersionNumber("firefox-10.source.tar.bz2"));
    Console.WriteLine(ExtractVersionNumber("firefox-10.0source.tar.bz2"));
    Console.WriteLine(ExtractVersionNumber("firefox-10.0.2source.tar.bz2"));
    Console.WriteLine(ExtractVersionNumber("firefox-10.0.2.5source.tar.bz2"));
    Console.WriteLine(ExtractVersionNumber("firefox-10.0.2.5.6source.tar.bz2"));
}   

解释

基本上有两部分:

  1. (\d+\.){0,3} - 匹配一个数字(一个或多个数字的不间断序列),后面跟一个点。匹配此0到3次。
  2. \d+ - 匹配一个数字(一个或多个数字的序列)。
  3. 这些工作如下:

    • 如果只有1个数字(或者即使只有1个数字后跟一个点),第一部分将不匹配,第二部分将匹配数字
    • 当有2个数字用点分隔时,第一部分与第一个数字和点匹配,第二部分与第二个数字匹配。
    • 对于由点分隔的3个数字,第一部分得到前2个数字&点,最后一个第三个数字
    • 对于由点分隔的4个或更多个数字,第一部分获得前3个数字和点,第二部分获得第四个数字。任何后续的数字和点都会被忽略。

    PS。如果你想确保你只得到连字符后的数字(例如,为了避免给4.0.1字符串firefox4.0.1-10.0.2.source.tar.bz2"),你可以在后面添加一个负面的外观来说明&#34;之前的字符版本号必须是连字符&#34;:(?<=-)(\d+\.){0,3}\d+