2014-01-30 4 views
0

Допустим, у меня есть это (в одну строку):Не разобрать строку, используя регулярное выражение

5: <null>, 
6: <null>, 
7: 5 

Я хочу, чтобы удалить строки, содержащие <null>. Мое текущее выражение это:

@"[\d-]" + ": <null>," 

Я уверен, что причина, это не работает, потому что регулярное выражение разбора 2-й части, и я не хочу, чтобы это. Любая помощь?

+0

хорошо вы ищете «5:» но ваш вход имеет «5:» – pm100

ответ

3

Да, я один из тех людей, которые не используют Regex для всего ... так вот версия без Regex:

var result = input.Split('\n').Where(x => !x.Contains("<null>")).ToArray(); 

Тогда, возможно использовать Join, чтобы создать одну строку после:

var originalWithoutNulls = string.Join("\n", result); 
+0

штрафные кто-то когда-то что-то сказать о»... регулярных выражениях .... теперь у вас есть 2 проблемы – pm100

+0

хех. Может быть, pm100. В любом случае, это работает красиво! Спасибо, тонна! – Cool12309

+0

+1. @ pm100 - некоторая история в цитате http://regex.info/blog/2006-09-15/247: Некоторые люди, столкнувшись с проблемой, думают: «Я знаю, я буду использовать регулярные выражения». Теперь у них есть две проблемы. –

2

Может быть просто Where + Contains/IndexOf вместо RegEx:

string[] lines =... 
var filteredLines = lines.Where(line => line.IndexOf("<null>") == -1).ToArray() 
1

Если данные структурированы по номерам (если не я могу повторить), используйте это как образец, чтобы он соответствовал. Здесь я использовал именованные захваты, чтобы получить пары ключевых значений и поместить их в словарь.

var data = @"5: <null>, 
6: <null>, 
7: 5"; 

var dictResult = 
Regex.Matches(data, @"^(?<Key>\d+):\s(?<Value>\d+)", RegexOptions.Multiline) 
    .OfType<Match>() 
    .ToDictionary (mt => mt.Groups["Key"].Value, mt => mt.Groups["Value"].Value); 

    Console.WriteLine (dictResult["7"]); // Prints 5 
    Console.WriteLine (dictResult.ContainsKey("5")); // False 
Смежные вопросы