2017-01-09 114 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,我的壞。感謝您指出了這一點。 –