Извлекать только правильные большинство n букв из строки

Как извлечь из другой строки подстроку, состоящую из шести правых букв?

Пример: моя строка "PER 343573". Теперь я хочу извлечь только "343573".

Как я могу это сделать?

вопрос задан 12.11.2009
Shyju
139547 репутация

21 ответов


  • 124 рейтинг
    string SubString = MyString.Substring(MyString.Length-6);
    
    ответ дан Vilx-, с репутацией 59456, 12.11.2009
  • 59 рейтинг

    Написать метод расширения для выражения функции Right(n);. Функция должна иметь дело с нулевыми или пустыми строками, возвращающими пустую строку, строками короче максимальной длины, возвращающими исходную строку, и строками длиннее максимальной длины, возвращающими максимальную длину крайних правых символов.

    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;
    }
    
    ответ дан stevehipwell, с репутацией 36139, 12.11.2009
  • 37 рейтинг

    Вероятно, лучше использовать метод расширения:

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

    Использование

    string myStr = "ABCDEPER 343573";
    string subStr = myStr.Right(6);
    
    ответ дан James, с репутацией 58478, 12.11.2009
  • 22 рейтинг
    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
    }
    

    Не должен выдавать ошибку, возвращает нули в виде пустой строки, возвращает усеченные или базовые значения. Используйте это как «testx». Слева (4) или ул. Право (12);

    ответ дан Jeff Crawford, с репутацией 271, 7.07.2014
  • 13 рейтинг

    MSDN

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

    РЕДАКТИРОВАТЬ: слишком медленно. , ,

    ответ дан RvdK, с репутацией 16418, 12.11.2009
  • 8 рейтинг

    , если вы не уверены в длине вашей строки, но уверены в количестве слов (в данном случае это всегда 2 слова, например, «xxx yyyyyy»), лучше использовать split.

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

    это всегда возвращает второе слово вашей строки.

    ответ дан Mahdi Tahsildari, с репутацией 5216, 3.07.2013
  • 6 рейтинг

    Это не совсем то, что вы просите, но, просто взглянув на пример, кажется, что вы ищете числовой фрагмент строки.

    Если это всегда так, то хорошим способом сделать это было бы использование регулярного выражения.

    var regex= new Regex("\n+");
    string numberString = regex.Match(page).Value;
    
    ответ дан chills42, с репутацией 11184, 12.11.2009
  • 5 рейтинг

    Гадание по вашим требованиям, но следующее регулярное выражение даст только 6 буквенно-цифровых символов перед концом строки и не будет совпадать в противном случае.

    string result = Regex.Match("PER 343573", @"[a-zA-Z\d]{6}$").Value;
    
    ответ дан Wade, с репутацией 91, 12.11.2009
  • 5 рейтинг

    Используйте это:

    String text = "PER 343573";
    String numbers = text;
    if (text.Length > 6)
    {
        numbers = text.Substring(text.Length - 6);
    }
    
    ответ дан cjk, с репутацией 38362, 12.11.2009
  • 3 рейтинг

    Используйте это:

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

    ответ дан Brandao, с репутацией 85, 3.03.2015
  • 3 рейтинг

    Так как вы используете. NET, который все компилируется в MSIL , просто ссылка Microsoft. VisualBasic и используют встроенный метод Microsoft Strings.Right :

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

    Нет необходимости создавать собственный метод расширения или другую работу. Результат достигается с помощью одной ссылки и одной простой строки кода.

    Как дополнительная информация об этом, использование методов Visual Basic с C # было задокументировано в другом месте . Я лично наткнулся на него первым, когда пытался проанализировать файл, и нашел этот поток SO при использовании класса Microsoft.VisualBasic.FileIO.TextFieldParser чрезвычайно полезным для анализа. CSV-файлы.

    ответ дан Aaron Thomas, с репутацией 2599, 27.06.2016
  • 2 рейтинг

    Это метод, который я использую: мне нравится, чтобы все было просто.

    private string TakeLast(string input, int num)
    {
        if (num > input.Length)
        {
            num = input.Length;
        }
        return input.Substring(input.Length - num);
    }
    
    ответ дан Tony_KiloPapaMikeGolf, с репутацией 509, 2.08.2017
  • 2 рейтинг

    Нулевые безопасные методы:

    Строки короче максимальной длины, возвращающие исходную строку

    Метод расширения правой строки

    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));
    
    ответ дан desmati, с репутацией 605, 14.01.2018
  • 1 рейтинг

    Другое решение, которое не может быть упомянуто

    S.Substring(S.Length < 6 ? 0 : S.Length - 6)
    
    ответ дан FLICKER, с репутацией 3821, 23.10.2017
  • 1 рейтинг

    Просто мысль:

    public static string Right(this string @this, int length) {
        return @this.Substring(Math.Max(@this.Length - length, 0));
    }
    
    ответ дан Hamido-san, с репутацией 188, 31.01.2018
  • 1 рейтинг

    Вот решение, которое я использую. , , Он проверяет, что длина входной строки не меньше запрашиваемой длины. Решения, которые я вижу выше, не учитывают это, к сожалению, что может привести к сбоям.

        /// 
    /// Gets the last x- of characters from the given string. /// If the given string's length is smaller than the requested the full string is returned. /// If the given is negative, an empty string will be returned. ///
     
        /// 
    The string from which to extract the last x- of characters.
        /// 
    The amount of characters to return.
        /// The last x- of characters from the given string.
        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);
            }
        }
    
    ответ дан Yves Schelpe, с репутацией 1462, 9.12.2014
  • 0 рейтинг

    Не прибегая к битовому преобразователю и битовому смещению (нужно быть уверенным в кодировании) это самый быстрый метод, который я использую как метод расширения '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);
    }
    
    ответ дан does_not_exist, с репутацией , 26.03.2010
  • 0 рейтинг

    Я использую Мин для предотвращения негативных ситуаций, а также обрабатывать нулевые строки

    // 
    /// Returns a string containing a specified number of characters from the right side of a string. ///
     
        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;
        }
    
    ответ дан RitchieD, с репутацией 1312, 15.06.2017
  • 0 рейтинг
    using Microsoft.visualBasic;
    
     public class test{
      public void main(){
       string randomString = "Random Word";
       print (Strings.right(randomString,4));
      }
     }
    

    вывод "Слово"

    ответ дан Steve Short, с репутацией 55, 7.09.2017
  • 0 рейтинг
    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"
    
    ответ дан Supawat Pusavanno, с репутацией 974, 3.08.2018
  • 0 рейтинг
    //s - your string
    //n - maximum number of right characters to take at the end of string
    (new Regex("^.*?(.{1,n})$")).Replace(s,"$1")
    
    ответ дан vldmrrr, с репутацией 518, 12.02.2018