我正面临着正则表达式分裂问题。
这是我的模式
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行)时,一切都很顺利..
为什么会这样?
答案 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();
修改强>