2015-01-09 147 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); 
    }