如何从字符串中获取最后2个单词(从倒数第二个空格开始)?

时间:2019-02-08 04:57:33

标签: c# linq

我的主要字符串是

“自1500年代20 TN 123 34起,Lorem Ipsum一直是业界标准的伪文本”

我只想从Main String获取“ 123 34”。 我已经完成了以下代码。

  string mainStr = " Lorem Ipsum has been the industry's standard dummy text ever since the 1500s 20 TN 123 34";
                string filterStr = mainStr.Substring(0, mainStr.LastIndexOf(" "));
                int sRange = filterStr.LastIndexOf(" ");
                string outputStr = mainStr.Substring(sRange+1);

如何用Linq方法完成(只需一行就可以了)?

5 个答案:

答案 0 :(得分:4)

使用linq来获取最后两个元素可能有点难以理解,因此我建议不要使用LastIndexOfSubstring的多行解决方案:

string mainStr = " Lorem Ipsum has been the industry's standard dummy text ever since the 1500s 20 TN 123 34";
var words = mainStr.Split();
var lastTwoWords = string.Join(" ", words.Skip(words.Length - 2));

如果您确实需要它成为linq,则可以使用ReverseTake的组合:

var lastTwoWords = string.Join(" ", mainStr.Split().Reverse().Take(2).Reverse());

答案 1 :(得分:1)

使用Linq:

string mainStr = " Lorem Ipsum has been the industry's standard dummy text ever since the 1500s 20 TN 123 34";

var reverse = mainStr.Split(' ').Reverse();
string output = reverse.Take(1).Last() + " " + reverse.Take(2).Last();

您可以使用LastOrDefault()

更好的表现:

int x1 = mainStr.Trim().IndexOf(" ");
int x2 = mainStr.Trim().LastIndexOf(" ");
int x3 = mainStr.Trim().LastIndexOf(" ", x2-1);

string firstWord = mainStr.Trim().Substring(0, x1);
string middleWord = mainStr.Trim().Substring(x1, x2 - x1);
string lastWord = mainStr.Trim().Substring(x2 + 1);
string output = mainStr.Trim().Substring(x3 + 1);  // returns 123 34

答案 2 :(得分:1)

我会将您已经拥有的内容转移到一个单独的方法中(并整理一下):

public static string GetLast2Words(string mainStr)
{
    int position = mainStr.LastIndexOf(' ', mainStr.LastIndexOf(' ') - 1);
    return position >= 0 ? mainStr.Substring(position) : null;
}

用法:

var outputStr = GetLast2Words(mainStr);

或者,您可以使用正则表达式:

var outputStr = Regex.Match(mainStr, "\\s(\\S+\\s\\S+$)").Groups[0].Value;
  • \s匹配空格
  • \S与任何非空格字符匹配

请注意,如果没有匹配项,则正则表达式方法将输出string.Empty,而第一个方法将输出null。

答案 3 :(得分:0)

使用Linq

如果您真的想在Linq中进行操作,则可以执行以下操作。

var list = mainStr.Split(new []{" "},StringSplitOptions.RemoveEmptyEntries).Reverse().Take(2).Reverse();

但是请注意,由于有两个Reverse语句,因此不建议这样做。

使用RegEx

更好的选择是使用正则表达式

var result = Regex.Match(mainStr,@"(\w*)\s(\w*)*$").Value;

输出

123 34

答案 4 :(得分:-1)

如果您可以获取字符串的长度,这可能是解决方案。

string mainStr = " Lorem Ipsum has been the industry's standard dummy text ever since the 1500s 20 TN 123 34";
string filterStr = String.Concat(mainStr.Skip(mainStr.Count() - 6));
Console.WriteLine(filterStr);