我正面临正则表达式拆分问题。
这是我的模式
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 行)时,一切正常。
为什么会发生?
为什么不匹配单词(不拆分),并取最后一个?
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(...)条件)。