2017-01-09 121 views
1

我面临正则表达式分割问题。C#正则表达式按分隔符分割

这里是我的模式

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行)时,一切都很顺利..

为什么会发生?

+1

您目前的代码应该输出'DZUKAS',对吧?你的意思是什么分隔符?另外,为什么不用'\ W +'分割,或者仅仅匹配'\ p {Lu} +'并且获得最后的匹配? –

+0

@WiktorStribiżew我需要在每行中以大写字母查找单词。 DZUKAS就是其中之一,就像KAS(第一线),MIRTI(第二) – Martin

+0

见https://ideone.com/lJQHaO –

回答

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.Length > 0。所以你面对的不是Regex,而是Linq问题(空字符串 sutisfies .All(...)条件)。

+0

我知道..有更简单的方法..但通过任务,我必须使用正则表达式分割 – Martin

+1

这个''[A-Z] +“'也将”提取“'CA'中的'CA'。 –

+0

@WiktorStribiżew:谢谢,我明白了,'\ b'是必需的。 –

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(); 
     } 
    } 
} 
+0

我也犯过同样的错误:'CA'中的'CA'会匹配(参见WiktorStribiżew对我的回答的评论) –

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

编辑:

+1

在'[]'中提到'.'完全可以,因为它是在问题中完成的;在上下文中,您不必* escape *'.'。 –

+0

@DmitryBychenko Ops,我的坏。感谢您指出了这一点。 –