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


110

如何substring从另一个中提取最右边六个字母组成的string

例如:我的字符串是"PER 343573"。现在我只想提取"343573"

我怎样才能做到这一点?


您可以将源代码用于VB.NET Right方法。您需要先转换为C#:referencesource.microsoft.com/#Microsoft.VisualBasic/…使用converter.telerik.com
Darren Griffith

但是VB代码依赖于strings.sc中的c#Substring函数
香蕉中的男人2014年

这确实不是一个很好的方法,但是如果遇到困难,可以添加对Microsoft.VisualBasic.dll的引用,并使用Right方法。它不是扩展方法。您必须像这样使用它:string endOfString = Strings.Right(wholeString, 6);
艾伦·麦克比(Alan McBee)-MSFT

Answers:


156
string SubString = MyString.Substring(MyString.Length-6);

35
如果字符串的长度不等于所需的字符数,则此方法无法正常工作。
stevehipwell,2009年

1
根据OP的确切要求,也可能在此抛出正则表达式。如果他只想在字符串末尾输入数字,那绝对是最轻松的解决方案,尤其是当数字的位数在以后的某些软件升级中可能有所不同时。
乔伊,

2
@JohannesRössel-我是正则表达式的忠实拥护者(请参阅我的回答),但是对于像这样的简单情况,我永远不会推荐它们。使用函数包装的任何答案都比正则表达式更适合代码维护。扩展方法(或.NET 2.0中的标准功能)是最佳解决方案。
stevehipwell,2009年

@ Stevo3000-如果字符串长度错误,则抛出一个错误的解决方案是有效的解决方案。不是唯一的解决方案,但仍然是。
Marc L.

3
@James-同样,只有标题提到了“ n个字母”。提出的实际问题要求“最右边的六个字母” :)
克里斯·罗杰斯

69

编写扩展方法来表达该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;
}

起始索引也不能小于0。
詹姆斯

2
@James-不会像sValue.Length > iMaxLength调用子字符串之前那样!
stevehipwell,2009年

3
很好的答案,但是在C#代码中看到匈牙利表示法有点麻烦。
Jerad Rose 2014年

1
@JeradRose-我在一个项目中工作,该项目的代码库是从VB3应用程序演变而来的(其中大部分是VB.NET),因此存在一些残留。
stevehipwell 2014年

4
@ Jalle,VB.NET具有Left,Right和Mid作为顶级功能,还有许多其他有用的东西,它们不是C#的一部分。不知道为什么,因为其中许多功能都不错。
ingredient_15939

40

使用扩展方法可能更好:

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

19
然后它将抛出NullReferenceException,就像您尝试对空字符串使用任何方法一样……
James

1
str.Length - length可能是负面的。第二个参数也是可选的。无需传递长度。
iheartcsharp

1
@ JMS10当然可以,但是多数民众赞成的不是我的。同样,是的,您可以在此处使用仅采用单个参数的覆盖。
詹姆斯

str?.Substring(str.Length-长度,长度);
Ludwo

26
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);一样使用它。


13

MSDN

String mystr = "PER 343573";
String number = mystr.Substring(mystr.Length-6);

编辑:太慢了...


9

如果不确定字符串的长度,但是可以确定字数(在这种情况下,总是2个字,例如'xxx yyyyyy'),则最好使用split。

string Result = "PER 343573".Split(" ")[1];

这总是返回字符串的第二个单词。


是的 假设OP的文本始终带有空格;就像他的例子一样:)
基督教

1
克里斯蒂安(Hei Christian):)我们对答案的认识不只几行。我只是简单地回答了这个问题,当然,在实际代码中还有很多事情要考虑。
Mahdi Tahsildari

7

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

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

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

-1正则表达式对于这样的事情有点过大,特别是当已经有内置正则表达式的时候。
詹姆斯,

1
如果您确实只需要后6个字符,我不是在争论使用这种方法,但是如果您的目标是提取一个数字(例如ID),该数字将来可能会更改为5或7位数字,是更好的方法。
chills42

1
旧答案,但+1支持使用正则表达式。尤其是因为.NET的String实现中(仍然)没有内置方法可以执行此@James。否则,这个问题可能永远不会存在。
CrazyIvan1974 '17

@ CrazyIvan1974不知道您为什么在评论中提到我
詹姆斯

5

用这个:

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

text?.Substring(text.Length-6)
Ludwo

5

根据您的要求进行猜测,但以下正则表达式仅在字符串末尾前产生6个字母数字,否则不匹配。

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

该解决方案是否合理地满足了模糊的要求?如果没有,请解释您的不赞成投票。
韦德

5

由于您使用的都是.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文件非常有用。


此方法在另一个SO线程中也有详细介绍:stackoverflow.com/a/15255454/2658159
Aaron Thomas

那很重要!但是作为VB家伙,很高兴一次将它托管给CSharpers!
SteveCinq '17

5
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"

1
我喜欢那种选择。详细,但易于理解,可以自动处理字符串太短的问题。
Andrew Grothe

3

用这个:

string mystr = "PER 343573"; int number = Convert.ToInt32(mystr.Replace("PER ",""));


3

另一个可能无法提及的解决方案

S.Substring(S.Length < 6 ? 0 : S.Length - 6)

3

空安全方法:

比返回原始字符串的最大长度短的字符串

字符串右扩展方法

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

2

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

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

2

这是我使用的方法:我喜欢保持简单。

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


1
//s - your string
//n - maximum number of right characters to take at the end of string
(new Regex("^.*?(.{1,n})$")).Replace(s,"$1")

有人将您的帖子标记为删除,我在评论队列中看到了它。我认为您的帖子标记有误。仅代码的答案不是低质量的。它会尝试回答这个问题吗?如果不是,则标记。从技术上讲是不正确的吗?下注。
Wai Ha Lee

1
代码中应附带有关如何解决OP中问题的书面说明。
Zze

1
好吧,我认为评论中的书面解释就足够了,不是吗?
vldmrrr

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

2
Array.Reverse接受数组,而不是字符串,并且if (myString.length > 6)。除了语法错误,为什么这是最快的方法?当然,仅使用子字符串会是更好的方法,它不需要所有这些数组复制。
1800

0

我使用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;
    }

0
using Microsoft.visualBasic;

 public class test{
  public void main(){
   string randomString = "Random Word";
   print (Strings.right(randomString,4));
  }
 }

输出是“字”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.