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

Но, (\ ш * [^ $]) соответствует каждому пункту, а не отфильтровывая SDI $ и TECHS-NT $ элементов. Как должно выглядеть мое регулярное выражение, если не (\ w * [^ $])?

+1

Если они всегда будут заканчиваться знаком $, вы просто просто проверяете 'str.EndsWith (" $ ")', который будет намного быстрее. –

+0

Я мог бы, но я занимаюсь своим RegEx. Вот почему я спрашиваю, что не так с моим RegEx, а не «Как отфильтровать этот символ». –

+0

В этом случае проблема возникает из-за того, что вы не задавали разделители вокруг своего регулярного выражения. Это регулярное выражение по существу говорит: по крайней мере, нулевые слова-символы, а затем не $. Но вы не говорите, когда начинать или прекращать искать. Например, в последней строке парсер regex рассматривает SDI $, SDI, SD, S при выполнении тестов. Попробуйте вместо этого использовать '@"^(\ w * [^ $]) $ ". Кроме того, \ w не охватывает пробелы, из-за которых первый элемент будет отклонен. –

ответ

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

Изменить EndsWith в Contains найти любой знак доллара, а не только те, на конце.

1

Regex совершенно ненужно здесь. Просто используйте метод Contains, чтобы увидеть, имеет ли строка в нем значение $.

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

Regex здесь не нужен, используйте IndexOf, который возвращает -1, если не найден.

if (str.IndexOf("$")==-1) 
    { 
     powershellResults.Add(str); 
    } 
Смежные вопросы