C# Regex 按分隔符分割

标签 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 行),一切正常..

为什么会这样?

最佳答案

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

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

编辑:如果我正确理解您的要求(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 的原因.长度 > 0。所以你遇到的不是 Regex 而是 Linq 问题(空字符串 满足 .All(...) 条件).

关于C# Regex 按分隔符分割,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41546523/

相关文章:

c# - 私有(private)内部类上的动态失败

c# - 在 C# 中捕获网络流量

java - 如何使用正则表达式匹配java中的参数列表

c++ - 将文本文件拆分为多个文件c++

C++ 将带\0 的字符串拆分为列表

c# - .NET CLR 内存\GC 时间百分比

c# - DateTime 可以为空吗?

sql - 在 Oracle 中返回正则表达式的所有匹配项

mysql - MySQL 的 REGEXP 无法正常工作

python - 将python中的字符串从左边开始分成两部分