【问题标题】:Extract only right most n letters from a string从字符串中只提取最右边的 n 个字母
【发布时间】:2010-12-15 21:25:11
【问题描述】:

如何从另一个string 中提取由最右边六个字母组成的substring

例如:我的字符串是"PER 343573"。现在我只想提取"343573"

我该怎么做?

【问题讨论】:

标签: c# string substring


【解决方案1】:
string SubString = MyString.Substring(MyString.Length-6);

【讨论】:

  • 如果字符串没有达到所需的字符数,则此方法无法正常工作。
  • 取决于 OP 到底想要什么,也可能会在此抛出正则表达式。如果他只想要字符串末尾的数字,那绝对是最轻松的解决方案,尤其是在以后的一些软件升级中位数可能会发生变化时。
  • @Johannes Rössel - 我是正则表达式的忠实粉丝(请参阅我的答案),但我绝不会在这种简单的情况下推荐它们。任何使用函数包装器的答案都比正则表达式更适合代码维护。扩展方法(或标准函数,如果 .NET 2.0)是最好的解决方案。
  • @Stevo3000 - 如果字符串长度错误,则抛出的解决方案是有效的解决方案。不是唯一的解决方案,但仍然如此。
  • @James - 说得有点过分了,只有标题提到了“n 个字母”。提出的实际问题要求“最右边的六个字母”:)
【解决方案2】:

写一个扩展方法来表达Right(n);函数。该函数应处理返回空字符串的 null 或空字符串,短于最大长度的字符串返回原始字符串,长于最大长度的字符串返回最右边字符的最大长度。

public static string Right(this string sValue, int iMaxLength)
{
  //Check if the value is valid
  if (string.IsNullOrEmpty(sValue))
  {
    //Set valid empty string as string could be null
    sValue = string.Empty;
  }
  else if (sValue.Length > iMaxLength)
  {
    //Make the string no longer than the max length
    sValue = sValue.Substring(sValue.Length - iMaxLength, iMaxLength);
  }

  //Return the string
  return sValue;
}

【讨论】:

  • 起始索引也不能小于0。
  • @James - 在调用子字符串之前它不会是 sValue.Length > iMaxLength
  • 很好的答案,但在 C# 代码中看到匈牙利符号有点重复。
  • @JeradRose - 我在一个项目中工作,该项目的代码库是从 VB3 应用程序(大部分是 VB.NET)演变而来的,所以有一些残余。
  • @Jalle,VB.NET 将 Left、Right 和 Mid 作为顶级函数,以及许多其他 C# 之外的有用功能。不知道为什么,因为其中很多都是不错的功能。
【解决方案3】:

使用扩展方法可能更好:

public static class StringExtensions
{
    public static string Right(this string str, int length)
    {
        return str.Substring(str.Length - length, length);
    }
}

用法

string myStr = "PER 343573";
string subStr = myStr.Right(6);

【讨论】:

  • 然后它会抛出一个 NullReferenceException 就像你尝试对空字符串使用任何方法一样......
  • str.Length - length 可能是否定的。第二个参数也是可选的。无需传递长度。
  • @JMS10 当然可以,但这比我更关心呼叫者。另外,是的,公平点,您可以在此处使用仅采用单个参数的覆盖。
  • str?.Substring(str.Length - 长度, 长度);
【解决方案4】:
using System;

public static class DataTypeExtensions
{
    #region Methods

    public static string Left(this string str, int length)
    {
        str = (str ?? string.Empty);
        return str.Substring(0, Math.Min(length, str.Length));
    }

    public static string Right(this string str, int length)
    {
        str = (str ?? string.Empty);
        return (str.Length >= length)
            ? str.Substring(str.Length - length, length)
            : str;
    }

    #endregion
}

不应出错,将 null 作为空字符串返回,返回修剪后的值或基值。像 "testx".Left(4) 或 str.Right(12) 一样使用它;

【讨论】:

    【解决方案5】:

    MSDN

    String mystr = "PER 343573";
    String number = mystr.Substring(mystr.Length-6);
    

    编辑:太慢了...

    【讨论】:

      【解决方案6】:

      如果您不确定字符串的长度,但您确定字数(在这种情况下总是 2 个字,例如 'xxx yyyyyy'),您最好使用 split。

      string Result = "PER 343573".Split(" ")[1];
      

      这总是返回字符串的第二个单词。

      【讨论】:

      • 是的;让我们假设 OP 的文本总是有空格;就像他的 example :)
      • Hei Christian :) 我们都知道不止几行的答案。我只是简单地回答了这个问题,当然,在实际代码中要考虑的事情还有很多。
      【解决方案7】:

      这并不完全是您所要求的,但仅查看示例,您似乎正在寻找字符串的数字部分。

      如果总是这样,那么一个好方法就是使用正则表达式。

      var regex= new Regex("\n+");
      string numberString = regex.Match(page).Value;
      

      【讨论】:

      • -1 正则表达式对于这样的事情有点矫枉过正,尤其是当已经有内置的方法可以做到这一点时。
      • 如果你真的只需要最后 6 个,我并不是在争论使用这种方法,而是如果你的目标是提取一个可能会变为 5 或 7 位的数字(例如 id)在未来的某个时候,这是一种更好的方式。
      • 旧答案,但 +1 支持使用正则表达式。特别是因为在.NET 的 String 实现中(仍然)没有内置方法来执行此操作@James。否则,这个问题可能根本不存在。
      • @CrazyIvan1974 不知道你为什么在评论中提到我
      【解决方案8】:

      由于您使用的是.NET,它全部编译为MSIL,只需引用Microsoft.VisualBasic,并使用微软内置的Strings.Right method

      using Microsoft.VisualBasic;
      ...
      string input = "PER 343573";
      string output = Strings.Right(input, 6);
      

      无需创建自定义扩展方法或其他工作。结果是通过一个引用和一行简单的代码实现的。

      作为进一步的信息,使用 C# 的 Visual Basic 方法已记录在 elsewhere。我个人在尝试解析文件时首先偶然发现了它,并发现 this SO thread 使用 Microsoft.VisualBasic.FileIO.TextFieldParser 类对于解析 .csv 文件非常有用。

      【讨论】:

      • 此方法也在此处的另一个 SO 线程中进行了详细说明:stackoverflow.com/a/15255454/2658159
      • 那是精神!但作为 VB 人,能一次称霸 CSharpers 真是太好了!
      【解决方案9】:

      使用这个:

      String text = "PER 343573";
      String numbers = text;
      if (text.Length > 6)
      {
          numbers = text.Substring(text.Length - 6);
      }
      

      【讨论】:

      • text?.Substring(text.Length - 6)
      【解决方案10】:

      根据您的要求进行猜测,但以下正则表达式将仅在字符串结尾之前的 6 个字母数字上产生,否则不匹配。

      string result = Regex.Match("PER 343573", @"[a-zA-Z\d]{6}$").Value;
      

      【讨论】:

      • 这个方案是不是不能合理地满足模糊的要求?如果不是,请解释您的反对意见。
      【解决方案11】:
      var str = "PER 343573";
      var right6 = string.IsNullOrWhiteSpace(str) ? string.Empty 
                   : str.Length < 6 ? str 
                   : str.Substring(str.Length - 6); // "343573"
      // alternative
      var alt_right6 = new string(str.Reverse().Take(6).Reverse().ToArray()); // "343573"
      

      这支持str 中的任意数量的字符。替代代码不支持null 字符串。而且,第一个更快,第二个更紧凑。

      如果知道str 包含短字符串,我更喜欢第二个。如果是长字符串,第一个更合适。

      例如

      var str = "";
      var right6 = string.IsNullOrWhiteSpace(str) ? string.Empty 
                   : str.Length < 6 ? str 
                   : str.Substring(str.Length - 6); // ""
      // alternative
      var alt_right6 = new string(str.Reverse().Take(6).Reverse().ToArray()); // ""
      

      var str = "123";
      var right6 = string.IsNullOrWhiteSpace(str) ? string.Empty 
                   : str.Length < 6 ? str 
                   : str.Substring(str.Length - 6); // "123"
      // alternative
      var alt_right6 = new string(str.Reverse().Take(6).Reverse().ToArray()); // "123"
      

      【讨论】:

      • 我喜欢这种选择。冗长,但易于理解并自动处理字符串太短的问题。
      【解决方案12】:

      另一种可能没有提到的解决方案

      S.Substring(S.Length < 6 ? 0 : S.Length - 6)
      

      【讨论】:

        【解决方案13】:

        使用这个:

        string mystr = "PER 343573"; int number = Convert.ToInt32(mystr.Replace("PER ",""));

        【讨论】:

          【解决方案14】:

          Null 安全方法:

          小于返回原始字符串的最大长度的字符串

          字符串右扩展方法

          public static string Right(this string input, int count) =>
              String.Join("", (input + "").ToCharArray().Reverse().Take(count).Reverse());
          

          字符串左扩展方法

          public static string Left(this string input, int count) =>
              String.Join("", (input + "").ToCharArray().Take(count));
          

          【讨论】:

            【解决方案15】:

            这是我使用的解决方案... 它检查输入字符串的长度是否不低于要求的长度。不幸的是,我在上面看到的解决方案没有考虑到这一点 - 这可能会导致崩溃。

                /// <summary>
                /// Gets the last x-<paramref name="amount"/> of characters from the given string.
                /// If the given string's length is smaller than the requested <see cref="amount"/> the full string is returned.
                /// If the given <paramref name="amount"/> is negative, an empty string will be returned.
                /// </summary>
                /// <param name="string">The string from which to extract the last x-<paramref name="amount"/> of characters.</param>
                /// <param name="amount">The amount of characters to return.</param>
                /// <returns>The last x-<paramref name="amount"/> of characters from the given string.</returns>
                public static string GetLast(this string @string, int amount)
                {
                    if (@string == null) {
                        return @string;
                    }
            
                    if (amount < 0) {
                        return String.Empty;
                    }
            
                    if (amount >= @string.Length) {
                        return @string;
                    } else {
                        return @string.Substring(@string.Length - amount);
                    }
                }
            

            【讨论】:

              【解决方案16】:

              这是我使用的方法:我喜欢保持简单。

              private string TakeLast(string input, int num)
              {
                  if (num > input.Length)
                  {
                      num = input.Length;
                  }
                  return input.Substring(input.Length - num);
              }
              

              【讨论】:

                【解决方案17】:
                //s - your string
                //n - maximum number of right characters to take at the end of string
                (new Regex("^.*?(.{1,n})$")).Replace(s,"$1")
                

                【讨论】:

                • 有人将您的帖子标记为删除和I saw it in a review queue。我认为您的帖子被错误地标记了。 Code-only answers are not low-quality。它是否试图回答这个问题?如果没有,请标记。它在技术上不正确吗?投反对票。
                • 代码应附有书面说明,说明如何解决 OP 中的问题。
                • 嗯,我认为在 cmets 中的书面解释就足够了,不是吗?
                【解决方案18】:

                只是一个想法:

                public static string Right(this string @this, int length) {
                    return @this.Substring(Math.Max(@this.Length - length, 0));
                }
                

                【讨论】:

                  【解决方案19】:

                  无需借助位转换器和位移位(需要确保编码) 这是我用作扩展方法“Right”的最快方法。

                  string myString = "123456789123456789";
                  
                  if (myString > 6)
                  {
                  
                          char[] cString = myString.ToCharArray();
                          Array.Reverse(myString);
                          Array.Resize(ref myString, 6);
                          Array.Reverse(myString);
                          string val = new string(myString);
                  }
                  

                  【讨论】:

                  • Array.Reverse 接受一个数组,而不是字符串,if (myString.length &gt; 6)。除了语法错误,为什么这是最快的方法?当然只使用 substring 会是更好的方法,它不需要所有这些数组的复制。
                  【解决方案20】:

                  我使用 Min 来防止负面情况并处理空字符串

                  // <summary>
                      /// Returns a string containing a specified number of characters from the right side of a string.
                      /// </summary>
                      public static string Right(this string value, int length)
                      {
                          string result = value;
                          if (value != null)
                              result = value.Substring(0, Math.Min(value.Length, length));
                          return result;
                      }
                  

                  【讨论】:

                    【解决方案21】:
                    using Microsoft.visualBasic;
                    
                     public class test{
                      public void main(){
                       string randomString = "Random Word";
                       print (Strings.right(randomString,4));
                      }
                     }
                    

                    输出是“字”

                    【讨论】:

                      【解决方案22】:
                                  //Last word of string :: -> sentence 
                                  var str  ="A random sentence";
                                  var lword = str.Substring(str.LastIndexOf(' ') + 1);
                      
                                  //Last 6 chars of string :: -> ntence
                                  var n = 6;
                                  var right = str.Length >n ? str.Substring(str.Length - n) : "";
                      

                      【讨论】:

                        猜你喜欢
                        • 2012-01-24
                        • 1970-01-01
                        • 2012-01-24
                        • 2011-12-19
                        • 2015-05-19
                        • 2020-02-04
                        • 2017-12-28
                        • 1970-01-01
                        相关资源
                        最近更新 更多