Как я могу извлечь одну, substring
состоящую из шести крайних правых букв, из другой string
?
Пример: моя строка "PER 343573"
. Теперь хочу только извлечь "343573"
.
Как я могу это сделать?
string endOfString = Strings.Right(wholeString, 6);
Как я могу извлечь одну, substring
состоящую из шести крайних правых букв, из другой string
?
Пример: моя строка "PER 343573"
. Теперь хочу только извлечь "343573"
.
Как я могу это сделать?
string endOfString = Strings.Right(wholeString, 6);
Ответы:
string SubString = MyString.Substring(MyString.Length-6);
Напишите метод расширения для выражения 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;
}
sValue.Length > iMaxLength
до вызова подстроки!
Наверное, лучше использовать метод расширения:
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);
str.Length - length
может быть отрицательным. Также второй параметр не обязателен. Не нужно передавать длину.
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);
если вы не уверены в длине своей строки, но уверены в количестве слов (в данном случае всегда 2 слова, например, xxx yyyyyy), вам лучше использовать split.
string Result = "PER 343573".Split(" ")[1];
это всегда возвращает второе слово вашей строки.
Это не совсем то, что вы просите, но просто глядя на пример, кажется, что вы ищете числовую часть строки.
Если это всегда так, то хороший способ сделать это - использовать регулярное выражение.
var regex= new Regex("\n+");
string numberString = regex.Match(page).Value;
Использовать это:
String text = "PER 343573";
String numbers = text;
if (text.Length > 6)
{
numbers = text.Substring(text.Length - 6);
}
Предполагая ваши требования, но следующее регулярное выражение даст только 6 буквенно-цифровых символов до конца строки и не совпадет в противном случае.
string result = Regex.Match("PER 343573", @"[a-zA-Z\d]{6}$").Value;
Поскольку вы используете .NET, который компилируется в MSIL , просто укажите Microsoft.VisualBasic и используйте встроенный Strings.Right
метод Microsoft :
using Microsoft.VisualBasic;
...
string input = "PER 343573";
string output = Strings.Right(input, 6);
Нет необходимости создавать собственный метод расширения или выполнять другую работу. Результат достигается с помощью одной ссылки и одной простой строки кода.
В качестве дополнительной информации по этому поводу использование методов Visual Basic с C # описано в другом месте . Я лично впервые наткнулся на это при попытке проанализировать файл и обнаружил, что этот поток SO при использовании Microsoft.VisualBasic.FileIO.TextFieldParser
класса чрезвычайно полезен для анализа файлов .csv.
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"
Нулевые безопасные методы:
Строки короче максимальной длины, возвращая исходную строку
Метод расширения строки справа
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));
Вот решение, которое я использую ... Он проверяет, что длина входной строки не меньше запрошенной длины. Приведенные выше решения, к сожалению, не учитывают это, что может привести к сбоям.
/// <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);
}
}
Это метод, который я использую: мне нравится все упрощать.
private string TakeLast(string input, int num)
{
if (num > input.Length)
{
num = input.Length;
}
return input.Substring(input.Length - num);
}
Просто мысль:
public static string Right(this string @this, int length) {
return @this.Substring(Math.Max(@this.Length - length, 0));
}
//s - your string
//n - maximum number of right characters to take at the end of string
(new Regex("^.*?(.{1,n})$")).Replace(s,"$1")
Не прибегая к преобразователю битов и сдвигу битов (необходимо быть уверенным в кодировании), это самый быстрый метод, который я использую как метод расширения «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 > 6)
. Если не считать синтаксических ошибок, почему это самый быстрый метод? Конечно, лучше было бы просто использовать подстроку, это не потребовало бы всего этого копирования массивов.
Я использую 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;
}