C# 仅从字符串中提取最右边的n个字母

C# 仅从字符串中提取最右边的n个字母,c#,string,substring,C#,String,Substring,如何从另一个字符串中提取由最右边的六个字母组成的子字符串 例如:我的字符串是“per343573”。现在我只想提取“343573” 我如何才能做到这一点?使用以下方法: string SubString = MyString.Substring(MyString.Length-6); String text = "PER 343573"; String numbers = text; if (text.Length > 6) { numbers = text.Substring(

如何从另一个
字符串
中提取由最右边的六个字母组成的
子字符串

例如:我的字符串是
“per343573”
。现在我只想提取
“343573”

我如何才能做到这一点?

使用以下方法:

string SubString = MyString.Substring(MyString.Length-6);
String text = "PER 343573";
String numbers = text;
if (text.Length > 6)
{
    numbers = text.Substring(text.Length - 6);
}

使用扩展方法可能更好:

public static class StringExtensions
{
    public static string Right(this string str, int length)
    {
        return str.Substring(str.Length - length, length);
    }
}
用法


编辑:太慢…

写一个扩展方法来表示
右侧(n)函数。该函数应处理返回空字符串的null或空字符串、小于返回原始字符串的最大长度的字符串以及大于返回最右边字符的最大长度的字符串

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;
}

这并不完全是您想要的,但仅看示例,您似乎正在查找字符串的数字部分

如果总是这样,那么使用正则表达式将是一种很好的方法

var regex= new Regex("\n+");
string numberString = regex.Match(page).Value;

猜测您的需求,但下面的正则表达式只会在字符串末尾之前的6个字母数字上生成,否则将不匹配

string result = Regex.Match("PER 343573", @"[a-zA-Z\d]{6}$").Value;

无需借助位转换器和位移位(需要确保编码) 这是我用作“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);
}

如果您不确定字符串的长度,但确定字数(在本例中始终为2个字,如“xxx-yyyyy”),则最好使用split

string Result = "PER 343573".Split(" ")[1];
这将始终返回字符串的第二个单词

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)”一样使用它

这是我使用的解决方案。。。 它检查输入字符串的长度是否不小于请求的长度。不幸的是,我在上面看到的解决方案没有考虑到这一点,这可能导致崩溃

    /// <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);
        }
    }
//
///从给定字符串中获取最后x个字符。
///如果给定字符串的长度小于请求的长度,则返回完整字符串。
///如果给定值为负数,将返回一个空字符串。
/// 
///要从中提取最后x个字符的字符串。
///要返回的字符数。
///给定字符串中的最后x个字符。
公共静态字符串GetLast(此字符串@string,int amount)
{
如果(@string==null){
返回@string;
}
如果(金额<0){
返回字符串。空;
}
如果(金额>=@string.Length){
返回@string;
}否则{
返回@string.Substring(@string.Length-amount);
}
}
使用以下方法:

String text = "PER 343573";
String numbers = text;
if (text.Length > 6)
{
    numbers = text.Substring(text.Length - 6);
}
string mystr=“PER 343573”;

int number=Convert.ToInt32(mystr.Replace(“PER”)

因为您使用的是.NET,所有编译到的都是.NET,只需参考,并且使用Microsoft的内置

using Microsoft.VisualBasic;
...
string input = "PER 343573";
string output = Strings.Right(input, 6);
无需创建自定义扩展方法或其他工作。结果是通过一个参考和一行简单的代码实现的


关于这方面的进一步信息,已经记录了使用Visual Basic方法和C#。我个人在尝试解析文件时首先偶然发现了它,并发现使用
Microsoft.VisualBasic.FileIO.TextFieldParser
类对解析.csv文件非常有用。

我使用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;
    }
//
///返回一个字符串,该字符串包含字符串右侧指定数量的字符。
/// 
公共静态字符串权限(此字符串值,int-length)
{
字符串结果=值;
if(值!=null)
结果=value.Substring(0,Math.Min(value.Length,Length));
返回结果;
}

这是我使用的方法:我喜欢让事情简单化

private string TakeLast(string input, int num)
{
    if (num > input.Length)
    {
        num = input.Length;
    }
    return input.Substring(input.Length - num);
}

输出是“Word”

另一种可能未提及的解决方案

S.Substring(S.Length < 6 ? 0 : S.Length - 6)
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));
字符串左扩展方法

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));
只是一个想法:

public static string Right(this string @this, int length) {
    return @this.Substring(Math.Max(@this.Length - length, 0));
}

var str=“123”;
var right6=string.IsNullOrWhiteSpace(str)?字符串。空
:长度<6?str
:str.Substring(str.Length-6);//"123"
//另类
var alt_right6=新字符串(str.Reverse().Take(6.Reverse().ToArray());//"123"
//字符串的最后一个字::->句子
var str=“随机句子”;
var lword=str.Substring(str.LastIndexOf(“”)+1);
//字符串的最后6个字符::->ntence
var n=6;
右侧变量=长度>n?str.Substring(str.Length-n):“”;

如果字符串的长度没有所需的字符数那么长,则此aproach无法正常工作。根据OP的确切要求,也可以在此处抛出正则表达式。如果s?他只想要字符串末尾的数字,那绝对是最简单的解决方案,特别是在以后的软件升级中数字可能会有所不同的情况下。@Johannes Rössel-我非常喜欢正则表达式(请参见我的答案),但对于这样的简单情况,我永远不会推荐它们。任何使用函数包装器的答案都比正则表达式更适合代码维护。扩展方法(或.NET 2.0中的标准函数)是最好的解决方案。@Stevo3000-如果字符串长度错误,则有一个抛出的解决方案是有效的解决方案。这不是唯一的解决办法,但仍然是。@James-to和pernickity一样,只有标题提到了“n个字母”。提出的实际问题是“最右边的六个字母”:)开始索引也不能小于0。@James-在调用子字符串之前,它不会是
sValue.Length>iMaxLength
!回答得很好,但见到胡有点费劲
//s - your string
//n - maximum number of right characters to take at the end of string
(new Regex("^.*?(.{1,n})$")).Replace(s,"$1")
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"
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"