2015-01-09 145 views
1

我有一個PowerShell腳本返回以下項目:

migration test 
TECHS-NT$ 
Administrator 
krbtgt 
SDI$ 

現在,我想消除包含$項目和飼料沒有一個$成的項目名單。喜歡的東西,

List<string> powershellResults = new List<string>(); 
    foreach (string str in Powershell.Create().AddScript(PS Script)) 
    { 
     if (Regex.IsMatch(str, @"(\w*[^$])")) 
     { 
      powershellResults.Add(str); 
     } 
    } 

    foreach (string str in powershellResults) 
    { 
     Console.WriteLine(str); 
    } 

但是,(\ W * [^ $])每個項目匹配過濾掉SDI $和TECHS-NT $物品代替。我的正則表達式應該是什麼樣子,如果不是(\ w * [^ $])?

+1

如果它們總是以$符號結束,那麼您只需檢查'str.EndsWith(「$」)'這會快得多。 – 2015-01-09 20:29:15

+0

我可以,但我行使我的RegEx。這就是爲什麼我問我的RegEx有什麼問題,而不是「如何過濾掉這個字符」。 – 2015-01-09 20:36:26

+0

在這種情況下,問題來自於您尚未在您的正則表達式中設置分隔符。這個正則表達式實質上是說:至少爲零個字符,然後不是$。但是你不會說什麼時候開始或停止尋找。例如,在最後一行中,正則表達式解析器在進行測試時會考慮SDI $,SDI,SD,S。嘗試使用'@「^(\ w * [^ $])$」'代替。此外,\ w不會涵蓋會導致第一個項目被拒絕的空間。 – 2015-01-09 20:43:18

回答

2

你的正則表達式看起來有點奇怪。如果你想匹配線結束一個美元符號,嘗試這樣的事情:

\$$ 

記住$指在一個正則表達式行/串的結束,所以使用它,它需要進行轉義。如果你想匹配任何行方含一個美元符號,簡單地說:

\$ 

不過,如果我們能說服你不要使用這個正則表達式,LINQ將是一個容易得多。簡單地說:

var res = from line in Powershell.Create().AddScript(PS Script) 
      where !line.EndsWith("$") 
      select line; 

或者:

var res = Powershell.Create().AddScript(PS Script).Where(q => !q.EndsWith("$")); 

變化EndsWithContains找到任何美元符號,而不僅僅是那些在最後。

1

正則表達式在這裏完全沒有必要。只需使用Contains方法來查看該字符串是否包含$。

foreach (string str in Powershell.Create().AddScript(PS Script)) 
{ 
    if (!str.Contains("$")) 
    { 
     powershellResults.Add(str); 
    } 
} 
0

正則表達式在這裏是不需要的,使用IndexOf在找不到時返回-1。

if (str.IndexOf("$")==-1) 
    { 
     powershellResults.Add(str); 
    }