我正面临正则表达式拆分问题。
这是我的模式
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/