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

Mar*_*tin 1 c# regex split

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

这是我的模式

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

这是文本文件:

ir KAS gi mus nugales.
jei! mes MIRTI NEBIJOM,
JEIGU mes nugalejom mirti
DZUKAS
Run Code Online (Sandbox Code Playgroud)

我有一项任务是在 upper 中找到最后一个单词,这里是代码:

z = words.LastOrDefault(c => c.All(ch => char.IsUpper(ch)));
Run Code Online (Sandbox Code Playgroud)

当行尾是某种分隔符时,它只是不打印z。当没有分隔符(第 3、4 行)时,一切正常。

为什么会发生?

Dmi*_*nko 5

为什么不匹配单词(不拆分),并取最后一个?

  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(); 
Run Code Online (Sandbox Code Playgroud)

编辑:如果我正确理解您的要求(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);
Run Code Online (Sandbox Code Playgroud)

测试

  Console.Write(string.Join(Environment.NewLine, result));
Run Code Online (Sandbox Code Playgroud)

输出

  KAS
  NEBIJOM
  JEIGU
  DZUKAS
Run Code Online (Sandbox Code Playgroud)

请注意,这.All(c => char.IsUpper(c))包括空字符串 case,这就是我们必须添加明确的原因word.Length > 0。所以,你不面对Regex,但LINQ的问题(空字符串sutisfies.All(...)条件)。