C#正则表达式由分隔符分割

时间:2017-01-09 11:00:58

标签: c# regex split

我正面临着正则表达式分裂问题。

这是我的模式

string[] words = Regex.Split(line, "[\\s,.;:/?!()\\-]+");

这是文本文件:

ir KAS gi mus nugales.
jei! mes MIRTI NEBIJOM,
JEIGU mes nugalejom mirti
DZUKAS

我有一个任务是找到上面的最后一个单词,这里是代码:

z = words.LastOrDefault(c => c.All(ch => char.IsUpper(ch)));

当在行的末尾是某种分隔符时,它只是不打印z。当没有分隔符(第3行,第4行)时,一切都很顺利..

为什么会这样?

3 个答案:

答案 0 :(得分:4)

为什么不匹配单词(不分割),拿最后一个?

  string source = @"ir KAS gi mus nugales.
                    jei!mes MIRTI NEBIJOM,
                    JEIGU mes nugalejom mirti
                    DZUKAS";

  // or @"\b\p{Lu}+\b" depending on letters you want being selected out
  string pattern = @"\b[A-Z]+\b";

  string result = Regex
    .Matches(source, pattern)         
    .OfType<Match>()
    .Select(match => match.Value)
    .LastOrDefault(); 

修改:如果我理解您的要求(<{1}} 必须保留,并且您必须输出最后一个所有大写字母字 per每一行),你正在寻找这样的东西:

Regex.Split

测试

  var result = source
    .Split(new string[] { Environment.NewLine }, StringSplitOptions.None)
    .Select(line => Regex.Split(line, "[\\s,.;:/?!()\\-]+"))
    .Select(words => words
       .Where(word => word.Length > 0 && word.All(c => char.IsUpper(c)))
       .LastOrDefault());

  // You may want to filter out lines which doesn't have all-ups words:
  // .Where(line => line != null);

输出

  Console.Write(string.Join(Environment.NewLine, result));

请注意, KAS NEBIJOM JEIGU DZUKAS 包含空字符串大小写,这就是我们必须添加显式.All(c => char.IsUpper(c))的原因。所以你不是面临word.Length > 0而是 Linq 问题(空字符串 sutisfies Regex条件)。

答案 1 :(得分:1)

using System;
using System.Text.RegularExpressions;

namespace ConsoleApp
{
    class Program
    {
        static void Main()
        {
            string s = @"ir KAS gi mus nugales.
jei!mes MIRTI NEBIJOM,
JEIGU mes nugalejom mirti
DZUKAS";
            Match result = Regex.Match(s, "([A-Z]+)", RegexOptions.RightToLeft);

            Console.WriteLine(result.Value);

            Console.ReadKey();
        }
    }
}

答案 2 :(得分:0)

从问题和评论来看,很难弄清楚你想要什么,但我会尝试涵盖这两种情况。

如果你正在寻找大写的全文中的最后一个单词,你可以这样做:

Regex r = new Regex("[,.;:/?!()\\-]+", RegexOptions.Multiline);
string result = r.Replace(source, string.Empty).Split(' ').LastOrDefault(word => word.All(c => char.IsUpper(c));

如果您想从每一行找到最后一场比赛:

Regex r = new Regex("[,.;:/?!()\\-]+", RegexOptions.Multiline);
string[] result = r.Replace(source, string.Empty).Split(Environment.NewLine).Select(line => line.Split(' ').LastOrDefault(word => word.All(c => char.IsUpper(c)).ToArray();

修改