C# 在数字后面修剪字符串

C# 在数字后面修剪字符串,c#,string,url,C#,String,Url,我需要调整我的代码,以便它将修剪数字后的url。 例如,我希望删除List=36之后的所有内容。字母和特殊字符是唯一可能跟在列表编号后面的字符。因此,我只想在url读取列表编号后的字母或特殊字符时修剪url。谢谢 提交时捕获的当前URL示例 https://portal.test/sites/test/testabc/Lists/TEST/DispFormSort.aspx?List=36caab7e%2D2234%2D4981%2D8225%%2Easpx https://portal.te

我需要调整我的代码,以便它将修剪数字后的url。 例如,我希望删除List=36之后的所有内容。字母和特殊字符是唯一可能跟在列表编号后面的字符。因此,我只想在url读取列表编号后的字母或特殊字符时修剪url。谢谢

提交时捕获的当前URL示例

https://portal.test/sites/test/testabc/Lists/TEST/DispFormSort.aspx?List=36caab7e%2D2234%2D4981%2D8225%%2Easpx

https://portal.test/sites/test/testabc/Lists/TEST/DispFormSort.aspx?List=36,http://portal.test/testabc/Lists/TEST/AllItems.aspx
我希望在提交时捕获的url:

捕获url的方法的当前代码:

    public static string GenerateShortUrl(SPList list, int itemId)
    {
        try
        {
            var item = list.GetItemById(itemId);
            var itemUrl = string.Empty;

            if (item.File == null)
                itemUrl = SPContext.Current.Web.Url + "/" + list.Forms[PAGETYPE.PAGE_DISPLAYFORM].Url + "?ID=" + item.ID;
            else
                itemUrl = SPContext.Current.Web.Url + "/" + item.Url;

            var generatedShortedUrl = GetShortUrl(itemUrl);

            return generatedShortedUrl;
        }
        catch (Exception ex)
        {
            Utilities.WriteError(ex.ToString());

            throw new SPException("An error occurred while attempting to shorten a URL.", ex);
        }
    }
您可以使用捕获所有内容,直到?List=[number]

您可以使用此正则表达式:

Regex.Match(str, @"^.*\?List=\d+").Value
您可以使用捕获所有内容,直到?List=[number]

您可以使用此正则表达式:

Regex.Match(str, @"^.*\?List=\d+").Value
编辑:更改了代码,我以为他只需要提取数字


编辑:更改了代码,我认为他必须只提取数字。

有时最困难的方法是最直接的方法。基于正则表达式的答案将返回不符合预期格式的URL的错误值

    static void Main(string[] args)
    {
        string inputString = @"https://portal.test/sites/test/testabc/Lists/TEST/DispFormSort.aspx?List=36caab7e%2D2234%2D4981%2D8225%%2Easpx";

        //TEST CASES:

        //string inputString = @"https://portal.test/sites/test/testabc/Lists/TEST/DispFormSort.aspx?SomeParam=36caab7e%2D2234%2D4981%2D8225%%2Easpx";
        //should return null

        //string inputString = @"https://portal.test/sites/test/testabc/Lists/TEST/DispFormSort.aspx?SomeParam=nih543&List=786yui";
        //should return https://portal.test/sites/test/testabc/Lists/TEST/DispFormSort.aspx?786

        //string inputString = @"https://portal.test/sites/test/testabc/Lists/TEST/DispFormSort.aspx?";
        //should return null

        //string inputString = @"https://portal.test/sites/test/testabc/Lists/TEST/DispFormSort.aspx";
        //should return null

        string result = GetShortenedListURL(inputString);

        Console.WriteLine(result);
        Console.ReadKey();
    }

    private static string GetShortenedListURL(string InputString)
    {
        //Split URL into address and parameter tokens
        var tokens = InputString.Split('?');
        if (tokens.Length > 1)
        {
            var urlParams = tokens[1].Split('&');
            const string listStarter = "LIST=";

            //Loop through parameters looking for one that begins with List
            foreach (var param in urlParams)
            {
                if (param.ToUpperInvariant().StartsWith(listStarter))
                {
                    //Found the right parameter, now look for a contiguous string of numbers
                    for (int numCounter = listStarter.Length; numCounter < param.Length; numCounter++)
                    {
                        if (!Char.IsDigit(param[numCounter]))
                        {
                            if (numCounter > listStarter.Length)
                            {
                                return tokens[0] + "?" + param.Substring(listStarter.Length, numCounter - listStarter.Length);
                            }
                        }
                    }

                }
            }

        }

        return null;
    }

有时艰难的道路是最直接的道路。基于正则表达式的答案将返回不符合预期格式的URL的错误值

    static void Main(string[] args)
    {
        string inputString = @"https://portal.test/sites/test/testabc/Lists/TEST/DispFormSort.aspx?List=36caab7e%2D2234%2D4981%2D8225%%2Easpx";

        //TEST CASES:

        //string inputString = @"https://portal.test/sites/test/testabc/Lists/TEST/DispFormSort.aspx?SomeParam=36caab7e%2D2234%2D4981%2D8225%%2Easpx";
        //should return null

        //string inputString = @"https://portal.test/sites/test/testabc/Lists/TEST/DispFormSort.aspx?SomeParam=nih543&List=786yui";
        //should return https://portal.test/sites/test/testabc/Lists/TEST/DispFormSort.aspx?786

        //string inputString = @"https://portal.test/sites/test/testabc/Lists/TEST/DispFormSort.aspx?";
        //should return null

        //string inputString = @"https://portal.test/sites/test/testabc/Lists/TEST/DispFormSort.aspx";
        //should return null

        string result = GetShortenedListURL(inputString);

        Console.WriteLine(result);
        Console.ReadKey();
    }

    private static string GetShortenedListURL(string InputString)
    {
        //Split URL into address and parameter tokens
        var tokens = InputString.Split('?');
        if (tokens.Length > 1)
        {
            var urlParams = tokens[1].Split('&');
            const string listStarter = "LIST=";

            //Loop through parameters looking for one that begins with List
            foreach (var param in urlParams)
            {
                if (param.ToUpperInvariant().StartsWith(listStarter))
                {
                    //Found the right parameter, now look for a contiguous string of numbers
                    for (int numCounter = listStarter.Length; numCounter < param.Length; numCounter++)
                    {
                        if (!Char.IsDigit(param[numCounter]))
                        {
                            if (numCounter > listStarter.Length)
                            {
                                return tokens[0] + "?" + param.Substring(listStarter.Length, numCounter - listStarter.Length);
                            }
                        }
                    }

                }
            }

        }

        return null;
    }

您完全可以使用正则表达式来实现这一点。正如您所说,字母和特殊字符是唯一可能跟随列表编号的字符,我的正则表达式将拾取所有字符,直到?List=[number],以及任何字母和特殊字符,直到找到不应拾取的数字或字符

Regex.Match(url, @"^.*\?List=\d+[A-Za-z._%+-]*+").Value

请尝试在此处进行测试:

您完全可以使用正则表达式来完成此操作。正如您所说,字母和特殊字符是唯一可能跟随列表编号的字符,我的正则表达式将拾取所有字符,直到?List=[number],以及任何字母和特殊字符,直到找到不应拾取的数字或字符

Regex.Match(url, @"^.*\?List=\d+[A-Za-z._%+-]*+").Value
试着在这里测试一下:

我更喜欢LINQ:

string url = @"https://portal.test/...";
string flag = "List=";
int flagIndex = url.IndexOf(flag) + flag.Length;
string shortUrl = new string(url.TakeWhile((ch, index) => 
                          index < flagIndex || char.IsDigit(ch)).ToArray());
我更喜欢林克:

string url = @"https://portal.test/...";
string flag = "List=";
int flagIndex = url.IndexOf(flag) + flag.Length;
string shortUrl = new string(url.TakeWhile((ch, index) => 
                          index < flagIndex || char.IsDigit(ch)).ToArray());

你可以这样做,即使基地是不一样的捕获一切,直到?然后用更新后的列表值将其推出即使基础不相同,您也可以这样做捕获所有内容,直到?并用更新后的列表值将其推出Hi,感谢您的输入。我只是显示了我所有的方法代码。我应该把forloop放在if语句中吗?我不清楚这个方法是做什么的,因为我不知道SPList类是做什么的。但是,您似乎只需要更改变量generatedShortedUrl=GetShortUrlitemUrl;调用以调用GetShortenedListURL。您必须检查null,这意味着它无法在URL中找到List=,并决定是否要引发异常或执行其他操作。您好,谢谢您的输入。我只是显示了我所有的方法代码。我应该把forloop放在if语句中吗?我不清楚这个方法是做什么的,因为我不知道SPList类是做什么的。但是,您似乎只需要更改变量generatedShortedUrl=GetShortUrlitemUrl;调用以调用GetShortenedListURL。您必须检查null,这意味着它无法在URL中找到List=,并决定是否要抛出异常或执行其他操作。