如何substring
从另一个中提取最右边六个字母组成的string
?
例如:我的字符串是"PER 343573"
。现在我只想提取"343573"
。
我怎样才能做到这一点?
string endOfString = Strings.Right(wholeString, 6);
如何substring
从另一个中提取最右边六个字母组成的string
?
例如:我的字符串是"PER 343573"
。现在我只想提取"343573"
。
我怎样才能做到这一点?
string endOfString = Strings.Right(wholeString, 6);
Answers:
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
}
不应出错,以空字符串返回null,返回修剪或基值。像“ 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;
由于您使用的都是.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文件非常有用。
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")
无需求助于位转换器和位移位(需要确保编码),这是我用作扩展方法“正确”的最快方法。
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;
}