Ответ 1
mystring.Substring(Math.Max(0, mystring.Length - 4)); //how many lines is this?
Если вы уверены, длина вашей строки не менее 4, то она еще короче:
mystring.Substring(mystring.Length - 4);
Предположим, что у меня есть строка:
string mystring = "34234234d124";
Я хочу получить последние четыре символа этой строки, которая "d124"
. Я могу использовать SubString
, но ему нужна пара строк кода.
Можно ли получить этот результат в одном выражении с помощью С#?
mystring.Substring(Math.Max(0, mystring.Length - 4)); //how many lines is this?
Если вы уверены, длина вашей строки не менее 4, то она еще короче:
mystring.Substring(mystring.Length - 4);
Вы можете использовать метод расширения:
public static class StringExtension
{
public static string GetLast(this string source, int tail_length)
{
if(tail_length >= source.Length)
return source;
return source.Substring(source.Length - tail_length);
}
}
И затем вызовите:
string mystring = "34234234d124";
string res = mystring.GetLast(4);
Хорошо, поэтому я вижу, что это старый пост, но почему мы переписываем код, который уже предоставлен в рамках?
Я бы предложил добавить ссылку на фреймворк DLL "Microsoft.VisualBasic"
using Microsoft.VisualBasic;
//...
string value = Strings.Right("34234234d124", 4);
string mystring = "34234234d124";
mystring = mystring.Substring(mystring.Length-4)
Использование Подстрока на самом деле довольно короткая и читаемая:
var result = mystring.Substring(mystring.Length - Math.Min(4, mystring.Length));
// result == "d124"
Вот еще одна альтернатива, которая не должна выполняться слишком плохо (из-за отложенного исполнения):
new string(mystring.Reverse().Take(4).Reverse().ToArray());
Хотя метод расширения для цели mystring.Last(4)
, безусловно, является самым чистым решением, хотя и немного больше работает.
Простое решение:
string mystring = "34234234d124";
string last4 = mystring.Substring(mystring.Length - 4, 4);
Вы можете просто использовать метод Substring
для С#. Например,
string str = "1110000";
string lastFourDigits = str.Substring((str.Length - 4), 4);
Он вернет результат 0000.
mystring = mystring.Length > 4 ? mystring.Substring(mystring.Length - 4, 4) : mystring;
Это просто:
int count = 4;
string sub = mystring.Substring(mystring.Length - count, count);
По сравнению с некоторыми предыдущими ответами основное различие заключается в том, что этот фрагмент кода учитывается при входной строке:
Вот он:
public static class StringExtensions
{
public static string Right(this string str, int length)
{
return str.Substring(str.Length - length, length);
}
public static string MyLast(this string str, int length)
{
if (str == null)
return null;
else if (str.Length >= length)
return str.Substring(str.Length - length, length);
else
return str;
}
}
Все, что вам нужно сделать, это...
String result = mystring.Substring(mystring.Length - 4);
Использовать общий Last<T>
. Это будет работать с ANY IEnumerable
, включая строку.
public static IEnumerable<T> Last<T>(this IEnumerable<T> enumerable, int nLastElements)
{
int count = Math.Min(enumerable.Count(), nLastElements);
for (int i = enumerable.Count() - count; i < enumerable.Count(); i++)
{
yield return enumerable.ElementAt(i);
}
}
И конкретный для строки:
public static string Right(this string str, int nLastElements)
{
return new string(str.Last(nLastElements).ToArray());
}
Это не сработает для любой длины строки.
string mystring = "34234234d124";
string last4 = Regex.Match(mystring, "(?!.{5}).*").Value;
// last4 = "d124"
last4 = Regex.Match("d12", "(?!.{5}).*").Value;
// last4 = "d12"
Это, вероятно, слишком велико для задачи, но если требуется дополнительная проверка, ее можно добавить в регулярное выражение.
Изменить: Я думаю, что это регулярное выражение будет более эффективным:
@".{4}\Z"
Определение:
public static string GetLast(string source, int last)
{
return last >= source.Length ? source : source.Substring(source.Length - last);
}
Использование:
GetLast("string of", 2);
Результат:
из
Я собрал код, модифицированный из разных источников, который получит желаемые результаты, и сделайте намного больше. Я допустил отрицательные значения int, значения int, которые превышают длину строки, а для конечного индекса меньше начального индекса. В этом последнем случае метод возвращает подстроку обратного порядка. Есть много комментариев, но дайте мне знать, если что-то неясно или просто сумасшедшее. Я играл с этим, чтобы понять, для чего я могу использовать его.
/// <summary>
/// Returns characters slices from string between two indexes.
///
/// If start or end are negative, their indexes will be calculated counting
/// back from the end of the source string.
/// If the end param is less than the start param, the Slice will return a
/// substring in reverse order.
///
/// <param name="source">String the extension method will operate upon.</param>
/// <param name="startIndex">Starting index, may be negative.</param>
/// <param name="endIndex">Ending index, may be negative).</param>
/// </summary>
public static string Slice(this string source, int startIndex, int endIndex = int.MaxValue)
{
// If startIndex or endIndex exceeds the length of the string they will be set
// to zero if negative, or source.Length if positive.
if (source.ExceedsLength(startIndex)) startIndex = startIndex < 0 ? 0 : source.Length;
if (source.ExceedsLength(endIndex)) endIndex = endIndex < 0 ? 0 : source.Length;
// Negative values count back from the end of the source string.
if (startIndex < 0) startIndex = source.Length + startIndex;
if (endIndex < 0) endIndex = source.Length + endIndex;
// Calculate length of characters to slice from string.
int length = Math.Abs(endIndex - startIndex);
// If the endIndex is less than the startIndex, return a reversed substring.
if (endIndex < startIndex) return source.Substring(endIndex, length).Reverse();
return source.Substring(startIndex, length);
}
/// <summary>
/// Reverses character order in a string.
/// </summary>
/// <param name="source"></param>
/// <returns>string</returns>
public static string Reverse(this string source)
{
char[] charArray = source.ToCharArray();
Array.Reverse(charArray);
return new string(charArray);
}
/// <summary>
/// Verifies that the index is within the range of the string source.
/// </summary>
/// <param name="source"></param>
/// <param name="index"></param>
/// <returns>bool</returns>
public static bool ExceedsLength(this string source, int index)
{
return Math.Abs(index) > source.Length ? true : false;
}
Итак, если у вас есть строка типа "Это метод расширения", вот несколько примеров и результатов, которые можно ожидать.
var s = "This is an extension method";
// If you want to slice off end characters, just supply a negative startIndex value
// but no endIndex value (or an endIndex value >= to the source string length).
Console.WriteLine(s.Slice(-5));
// Returns "ethod".
Console.WriteLine(s.Slice(-5, 10));
// Results in a startIndex of 22 (counting 5 back from the end).
// Since that is greater than the endIndex of 10, the result is reversed.
// Returns "m noisnetxe"
Console.WriteLine(s.Slice(2, 15));
// Returns "is is an exte"
Надеюсь, эта версия поможет кому-то. Он работает так же, как обычно, если вы не используете отрицательные числа и задаете значения по умолчанию для параметров вне диапазона.
string var = "12345678";
if (var.Length >= 4)
{
var = var.substring(var.Length - 4, 4)
}
// result = "5678"
Предполагая, что вам нужны строки между строкой, которая содержит 10 символов от последнего символа, и вам нужно всего 3 символа;
say StreamSelected = "rtsp://72.142.0.230: 80/SMIL-CHAN-273/4CIF-273.stream" в приведенном выше, мне нужно извлечь "273", который я буду использовать в запросе базы данных
//find the length of the string
int streamLen=StreamSelected.Length;
//now remove all characters except the last 10 characters
string streamLessTen = StreamSelected.Remove(0,(streamLen - 10));
//extract the 3 characters using substring starting from index 0
//show Result is a TextBox (txtStreamSubs) with
txtStreamSubs.Text = streamLessTen.Substring(0, 3);