2012-03-07 33 views
3

我有一個正則表達式可以在簡單的邏輯語句中分割出單詞運算符和括號(例如「WORD1 & WORD2 |(WORd_3 &!word_4)」。我提出的正則表達式是 「([A-ZA-Z0-9 _] +?)|(?[& \ |!(){1})」 這裏是一個快速測試程序Regex.Split在結果數組中添加空字符串


using System; 
using System.Text.RegularExpressions; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
     Console.WriteLine("* Test Project *"); 
     string testExpression = "!(LIONV6 | NOT_superCHARGED) &RHD"; 
     string removedSpaces = testExpression.Replace(" ", ""); 
     string[] expectedResults = new string[] { "!", "(", "LIONV6", "|", "NOT_superCHARGED", ")", "&", "RHD" }; 
     string[] splits = Regex.Split(removedSpaces, @"(?[A-Za-z0-9_]+)|(?[&!\|()]{1})"); 

     Console.WriteLine("Expected\n{0}\nActual\n{1}", expectedResults.AllElements(), splits.AllElements()); 

     Console.WriteLine("*** Any Key to finish ***"); 
     Console.ReadKey(); 
    } 
} 

public static class Extensions 
{ 
    public static string AllElements(this string[] str) 
    { 
     string output = ""; 
     if (str != null) 
     { 
      foreach (string item in str) 
      { 
       output += "'" + item + "',"; 
      } 
     } 
     return output; 
    } 
} 

正則表達式完成將單詞和運算符按正確順序拆分爲數組所需的工作,但結果數組包含ma是空的元素,我無法弄清楚爲什麼。它不是一個嚴重的問題,因爲我在使用數組時忽略了空元素,但我希望Regex儘可能地完成所有工作,包括忽略空格。

+0

你在哪裏期待輸入字符串中的空格去?你沒有他們在你預期的陣列,但我不知道你在哪裏擺脫他們在任何地方... – Chris 2012-03-07 12:04:25

+1

@Chris沒有空格,他用testExpression.Replace(「」,「」); – 2012-03-07 12:11:22

+0

@DorCohen:啊,我真想知道我是否在密集。看起來我是。;-) – Chris 2012-03-07 12:13:30

回答

0
var matches = Regex.Matches(removedSpaces, @"(\w+|[&!|()])"); 

foreach (var match in matches) 
    Console.Write("'{0}', ", match); // '!', '(', 'LIONV6', '|', 'NOT_superCHARGED', ')', '&', 'RHD', 

其實,你並不需要提取的標識符和運營商之前刪除的空間,我提出的正則表達式無論如何都會忽略它們。

2

試試這個:

string[] splits = Regex.Split(removedSpaces, @"(?[A-Za-z0-9_]+)|(?[&!\|()]{1})").Where(x => x != String.Empty); 
+0

upvoted良好的橫向思維,但正則表達式實際上並沒有這樣做。 – 2012-03-07 12:22:04

1

由於分割工作的方式,空間很小。來自help page

如果多個匹配彼此相鄰,則會將一個空字符串插入到數組中。

什麼拆分標準是把你的比賽作爲分隔符。因此實際上,將返回的標準是相鄰匹配之間的很多空字符串(想象一下,如果您將",,,,"分割爲",",那麼您可能會預期所有空位。這種幫助頁面,雖然是:

如果捕獲括號在一個Regex.Split表達式中使用,任何 捕獲文本包含得到的字符串數組中

這是你做了什麼的原因。你真的想要進來在那裏。因此,它現在正在向您顯示使用分隔符分隔的文本(所有空字符串)。

因爲正則表達式中的內容實際上是您想要匹配的內容,所以您所做的只是匹配正則表達式(與Regex.Match)可能會更好。

這樣的事情(使用一些LINQ轉換爲字符串數組):

Regex.Matches(testExpression, @"([A-Za-z0-9_]+)|([&!\|()]{1})") 
    .Cast<Match>() 
    .Select(x=>x.Value) 
    .ToArray(); 

注意,因爲這是採取積極的比賽並不需要的空間將被首先刪除。

+0

感謝您的完整解釋。我已經去了匹配的想法。 – 2012-03-07 12:50:48

相關問題