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

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

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

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

90 голосов | спросил Shyju 12 42009vEurope/Moscow11bEurope/MoscowThu, 12 Nov 2009 16:54:31 +0300 2009, 16:54:31

19 ответов


0

Напишите метод расширения для выражения функции 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 12 42009vEurope/Moscow11bEurope/MoscowThu, 12 Nov 2009 17:03:56 +0300 2009, 17:03:56
0

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

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 12 42009vEurope/Moscow11bEurope/MoscowThu, 12 Nov 2009 16:56:03 +0300 2009, 16:56:03
0
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» .Left (4) или str.Right (12);

ответил Jeff Crawford 8 J000000Tuesday14 2014, 00:48:05
0

MSDN

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

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

ответил RvdK 12 42009vEurope/Moscow11bEurope/MoscowThu, 12 Nov 2009 16:57:35 +0300 2009, 16:57:35
0

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

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

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

ответил Mahdi Tahsildari 3 J000000Wednesday13 2013, 17:04:36
0

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

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

var regex= new Regex("\n+");
string numberString = regex.Match(page).Value;
ответил chills42 12 42009vEurope/Moscow11bEurope/MoscowThu, 12 Nov 2009 17:16:48 +0300 2009, 17:16:48
0

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

String text = "PER 343573";
String numbers = text;
if (text.Length > 6)
{
    numbers = text.Substring(text.Length - 6);
}
ответил cjk 12 42009vEurope/Moscow11bEurope/MoscowThu, 12 Nov 2009 16:55:39 +0300 2009, 16:55:39
0

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

string result = Regex.Match("PER 343573", @"[a-zA-Z\d]{6}$").Value;
ответил Wade 12 42009vEurope/Moscow11bEurope/MoscowThu, 12 Nov 2009 18:46:50 +0300 2009, 18:46:50
0

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

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

ответил Brandao 3 MarpmTue, 03 Mar 2015 16:27:34 +03002015-03-03T16:27:34+03:0004 2015, 16:27:34
0

Поскольку вы используете .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 27 J0000006Europe/Moscow 2016, 19:08:09
0

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

private string TakeLast(string input, int num)
{
    if (num > input.Length)
    {
        num = input.Length;
    }
    return input.Substring(input.Length - num);
}
ответил Tony_KiloPapaMikeGolf 2 PM00000080000005131 2017, 20:02:51
0

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

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

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

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 14 Jpm1000000pmSun, 14 Jan 2018 23:32:46 +030018 2018, 23:32:46
0

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

    /// <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);
        }
    }
ответил Yves Schelpe 9 TueEurope/Moscow2014-12-09T17:10:27+03:00Europe/Moscow12bEurope/MoscowTue, 09 Dec 2014 17:10:27 +0300 2014, 17:10:27
0

Еще одно решение, которое не может быть упомянуто

S.Substring(S.Length < 6 ? 0 : S.Length - 6)
ответил FLICKER 24 +03002017-10-24T00:04:08+03:00312017bEurope/MoscowTue, 24 Oct 2017 00:04:08 +0300 2017, 00:04:08
0

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

public static string Right(this string @this, int length) {
    return @this.Substring(Math.Max(@this.Length - length, 0));
}
ответил Hamid Sadeghian 31 Jpm1000000pmWed, 31 Jan 2018 19:58:49 +030018 2018, 19:58:49
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 3 AM000000110000001531 2018, 11:56:15
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);
}
ответил 26 MarpmFri, 26 Mar 2010 20:23:26 +03002010-03-26T20:23:26+03:0008 2010, 20:23:26
0
using Microsoft.visualBasic;

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

вывод - «Слово»

ответил Steve Short 7 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 07 Sep 2017 17:58:52 +0300 2017, 17:58:52
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 13 FebruaryEurope/MoscowbTue, 13 Feb 2018 00:58:09 +0300000000amTue, 13 Feb 2018 00:58:09 +030018 2018, 00:58:09

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132