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

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

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

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

 D-Money13 мая 2014 г., 22:17
Вы можете использовать исходный код для метода VB.NET Right. Вы'сначала нужно преобразовать в C #:referencesource.microsoft.com/#Microsoft.VisualBasic/... Конвертировать в C # используяconverter.telerik.com
 Our Man in Bananas11 дек. 2014 г., 16:14
но код VB опирается на функцию подстроки c # в strings.sc
 drzaus14 дек. 2015 г., 18:33
 Alan McBee - MSFT22 янв. 2015 г., 04:50
Это не очень хороший способ сделать это, но если выВ крайнем случае, вы можете добавить ссылку на Microsoft.VisualBasic.dll и использовать метод Right. Это не метод расширения. Вы должны использовать это так:string endOfString = Strings.Right(wholeString, 6);

Ответы на вопрос(21)

//s - your string
//n - maximum number of right characters to take at the end of string
(new Regex("^.*?(.{1,n})$")).Replace(s,"$1")
 Wai Ha Lee13 февр. 2018 г., 00:05
Кто-то отметил ваш пост для удаления иЯ видел это в очереди обзора, Я думаю, что ваш пост был неправильно помечен.Ответы только на код не некачественные, Пытается ли он ответить на вопрос? Если нет, отметьте. Это технически неверно? Downvote.
 Zze13 февр. 2018 г., 01:01
Код должен сопровождаться письменным объяснением того, как он исправляет проблему в ФП.
 vldmrrr13 февр. 2018 г., 16:14
Ну, я думал, что письменного объяснения в комментариях было достаточно, нет?

MSDN

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

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

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

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

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

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

 SteveCinq22 нояб. 2017 г., 08:23
Тот'Психическое! Но, как VB парень, этоприятно на этот раз одолеть CSharpers!
 Aaron Thomas27 июн. 2016 г., 18:10
Этот подход также был подробно описан в другой ветке SO здесь:stackoverflow.com/a/15255454/2658159

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

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);
 James22 дек. 2017 г., 04:31
@ JMS10, конечно, это может быть, но это больше беспокоит звонящих, чем мое. Также, честно говоря, вы можете использовать переопределение, которое принимает здесь только один параметр.
 James13 нояб. 2009 г., 10:16
Затем он выдаст исключение NullReferenceException, как если бы вы попытались использовать любой метод для пустой строки ...
 stevehipwell13 нояб. 2009 г., 10:11
Что если str равен нулю?
 iheartcsharp21 дек. 2017 г., 21:02
str.Length - length может быть отрицательным. Также второй параметр является необязательным. Не нужно передавать длину.

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

чтобы предотвратить негативные ситуации, а также обрабатывать нулевые строки

// <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;
    }

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

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

var regex= new Regex("\n+");
string numberString = regex.Match(page).Value;
 James18 мая 2017 г., 12:50
@ CrazyIvan1974 не знаю, почему тыупомянул меня в своем комментарии
 chills4213 нояб. 2009 г., 14:24
Я не спорю об использовании этого метода, если вам действительно нужны только последние 6, но если ваша цель - извлечь число (например, идентификатор), которое может измениться до 5 или 7 цифр в какой-то момент в будущем, это лучший путь.
 James13 нояб. 2009 г., 10:17
-1 регулярные выражения немного излишни для чего-то подобного, особенно когда уже есть встроенные методы для этого.
 CrazyIvan197418 мая 2017 г., 03:59
Старый ответ, но +1 для поддержки использования регулярных выражений. Тем более, что в (.NET) нет (все еще) встроенных методовСтроковая реализация для этого @James. В противном случае этот вопрос, возможно, никогда не существовал.
 stevehipwell12 нояб. 2009 г., 15:57
+1 за другой подход.
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 содержащий короткую строку. если оно's длинная строка, первая более подходящая.

например

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"
 Andrew Grothe07 нояб. 2018 г., 18:12
Мне нравится эта альтернатива. Подробный, но простой для понимания и автоматически решающий проблему со слишком короткой строкой.

Напишите метод расширения для выражения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;
}
 stevehipwell14 июл. 2014 г., 17:22
@JeradRose - я работаю в проекте, в котором основа кода развивалась из приложения VB3 (в основном это VB.NET), поэтому есть некоторые остатки.
 Jerad Rose10 июл. 2014 г., 17:46
Отличный ответ, но было немного сложно увидеть венгерскую нотацию в коде C #.
 Jerad Rose14 июл. 2014 г., 18:16
@ Stevo3000 Ах, тогда это имеет смысл. :)
 stevehipwell12 нояб. 2009 г., 15:54
@James - Это победилобыть какsValue.Length > iMaxLength до вызова подстроки!
 ingredient_1593902 авг. 2014 г., 05:52
@Jalle, VB.NET имеет функции Left, Right и Mid в качестве функций верхнего уровня, а также много других полезных вещей, которые не являются частью C #. Не уверен, почему, так как многие из них являются достойными функциями.
 James12 нояб. 2009 г., 15:06
Начальный индекс также не может быть меньше 0.

но уверены в количестве слов (в этом случае всегда 2 слова, например 'ххх гггггг ') вы'Я бы лучше использовал сплит.

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

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

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

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

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

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));
 Abu Sufyan14 мар. 2018 г., 16:13
Хорошая работа, работает нормально
Решение Вопроса
string SubString = MyString.Substring(MyString.Length-6);
 Mahdi Tahsildari03 июл. 2013 г., 15:02
Не правильно, если длина не так, как хотелось бы, разделение работает лучше.
 Marc L.19 мая 2014 г., 23:10
@ Stevo3000 - наличие решения, которое выдает, если строка имеет неправильную длину, является допустимым решением. Не единственное решение, но все же.
 Chris Rogers05 мар. 2015 г., 22:39
@James - чтобы быть столь же пагубным, только упомянутое названиен буквы ", Фактический вопрос, заданный для "самые правые шесть букв  :)
 stevehipwell12 нояб. 2009 г., 14:59
Этот подход не работает правильно, если строка не соответствует требуемому количеству символов.
 stevehipwell12 нояб. 2009 г., 15:57
@ Йоханнес Рёя - яЯ большой поклонник регулярных выражений (см. мои ответы), но яЯ никогда не рекомендую их для такой простой ситуации, как эта. Любой из ответов, использующих оболочку функции, лучше подходит для обслуживания кода, чем для регулярного выражения. Метод расширения (или стандартная функция, если .NET 2.0) является лучшим решением.
 Joey12 нояб. 2009 г., 15:10
В зависимости от того, что именно хочет ОП, можно также использовать регулярные выражения. Если s? Он хочет только число в конце строки, это 'Это определенно самое безболезненное решение, особенно если число цифр может измениться при более позднем обновлении программного обеспечения.
 Vilx-22 дек. 2017 г., 09:11
Вопрос, который я прочитал, былHow can I extract a substring which is composed of the rightmost six letters from another string? ... How can I do this? Из этого я понимаю, что у ОП были проблемы именно с этой частью - само извлечение подстроки. Мой ответ показывает, как это сделать. Если у ОП есть другие требования помимо этого (что, вероятно, но здесь не упомянуто), он / она может адаптировать эту линию в более широкое решение в соответствии со своими потребностями.
 James22 дек. 2017 г., 04:31
@ChrisRogers это правда ... однако, я думаю, что этоочевидно, что общая полезная функция полезнее строгойдай мне 6 символов функция.

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

мне нравится, чтобы все было просто.

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

енным в кодировании), это самый быстрый метод, который я использую в качестве метода расширения ».Правильно'.

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);
}
 1800 INFORMATION19 дек. 2013 г., 03:54
Array.Reverse принимает массив, а не строку, иif (myString.length > 6), Помимо синтаксических ошибок, почему это самый быстрый метод? Конечно, просто использовать подстроку было бы лучше,не требует всего этого копирования массивов.

Использовать этот:

String text = "PER 343573";
String numbers = text;
if (text.Length > 6)
{
    numbers = text.Substring(text.Length - 6);
}
 stevehipwell13 нояб. 2009 г., 09:33
Что, еслиtext нулевой?
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);

 George Birbilis12 дек. 2018 г., 14:13
нет необходимости использовать>=, можно просто использовать>

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

S.Substring(S.Length < 6 ? 0 : S.Length - 6)
using Microsoft.visualBasic;

 public class test{
  public void main(){
   string randomString = "Random Word";
   print (Strings.right(randomString,4));
  }
 }

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

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

    /// <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.
    /// </paramref></see></paramref></summary>
    /// <param name="string">The string from which to extract the last x-<paramref name="amount"> of characters.
    /// <param name="amount">The amount of characters to return.
    /// <returns>The last x-<paramref name="amount"> of characters from the given string.</paramref></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);
        }
    }
</paramref>

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

string result = Regex.Match("PER 343573", @"[a-zA-Z\d]{6}$").Value;
 Wade13 нояб. 2009 г., 16:42
Разве это решение не соответствует разумным требованиям? Если нет, объясните, пожалуйста, ваше голосование.

Ваш ответ на вопрос