Как я могу извлечь substring
, который состоит из шести самых правых букв из другого string
?
Пример: моя строка - "PER 343573"
. Теперь я хочу извлечь только "343573"
.
Как я могу это сделать?
Как я могу извлечь substring
, который состоит из шести самых правых букв из другого string
?
Пример: моя строка - "PER 343573"
. Теперь я хочу извлечь только "343573"
.
Как я могу это сделать?
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;
}
Вероятно, лучше использовать метод расширения:
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);
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
}
Не следует использовать ошибку, возвращает nulls как пустую строку, возвращает обрезанные или базовые значения. Используйте его как "testx".Left(4) или str.Right(12);
String mystr = "PER 343573";
String number = mystr.Substring(mystr.Length-6);
ИЗМЕНИТЬ: слишком медленно...
если вы не уверены в длине своей строки, но вы уверены в количестве слов (всегда в этом случае 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 и используйте встроенный метод Microsoft Strings.Right
:
using Microsoft.VisualBasic;
...
string input = "PER 343573";
string output = Strings.Right(input, 6);
Не нужно создавать собственный метод расширения или другую работу. Результат достигается с помощью одной ссылки и одной простой строки кода.
Как дополнительная информация об этом, использование методов Visual Basic с С# было задокументировано в другом месте. Я лично наткнулся на него первым, когда пытался проанализировать файл, и обнаружил, что этот поток 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"
Используйте это:
string mystr = "PER 343573";
int number = Convert.ToInt32(mystr.Replace("PER ",""));
Другое решение, которое не может быть упомянуто
S.Substring(S.Length < 6 ? 0 : S.Length - 6)
Нулевые безопасные методы:
Строки короче максимальной длины, возвращающие исходную строку
Метод расширения правой строки
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));
Это метод, который я использую: мне нравится держать вещи простыми.
private string TakeLast(string input, int num)
{
if (num > input.Length)
{
num = input.Length;
}
return input.Substring(input.Length - num);
}
Вот решение, которое я использую... Он проверяет, что длина входной строки не меньше заданной длины. Решения, которые я вижу выше, не учитывают это, к сожалению, что может привести к сбоям.
/// <summary>
/// Gets the last x-<paramref name="amount"/> of characters from the given string.
/// If the given string 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);
}
}
Просто мысль:
public static string Right(this string @this, int length) {
return @this.Substring(Math.Max(@this.Length - length, 0));
}
Не прибегая к битовому преобразователю и смещению битов (нужно обязательно кодировать) это самый быстрый метод, который я использую как метод расширения "Право".
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);
}
Я использую 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;
}
using Microsoft.visualBasic;
public class test{
public void main(){
string randomString = "Random Word";
print (Strings.right(randomString,4));
}
}
вывод - "Word"
//s - your string
//n - maximum number of right characters to take at the end of string
(new Regex("^.*?(.{1,n})$")).Replace(s,"$1")