2012-01-18 2 views
1

Я пытаюсь найти строку в текстовом файле. Для этого я использую метод RegEx. Но мне нужно получить предыдущую строку, которая существует до найденной строки, как выход метода. Как я могу сделать это с помощью C#? Может ли кто-нибудь дать мне какую-нибудь идею?Найти строку, но вернуть предыдущую строку

Для примера:
В этом Textfile является линия с 'routerbl router0000;'
Я ищу 'router0000;', и если я найти 'router0000;' то я хочу, чтобы получить 'routerbl'.

+1

Нам нужно больше примеров возможных строк, что должно и не должно совпадать и что нужно вернуть. – Oded

ответ

4

У вас есть два pos sibilities

  1. матч, что вы хотите с помощью capturing group, что-то вроде этого

    (\S+)\s+router0000 
    

    и вы найдете свой результат в группе захвата 1

  2. Подбирайте шаблон и обеспечить следующую строку с lookahead

    \S+(?=\s+router0000) 
    

    это будет соответствовать только той части, которую вы хотите.

+0

thx для справки. Я пытался воспользоваться второй возможностью, и теперь она работает. – user1051723

-1

Предполагая, что является примером полной линии:

Regex expression = new Regex("(.*) router0000"); 
+0

Это соответствует части 'router0000', а не' routerbl'. – Aphelion

+0

«Я ищу« router0000; » и если я нахожу 'router0000;' то я хочу получить «routerbl». Он хочет получить часть в начале строки. Я согласен с тем, что он сказал, чтобы соответствовать и возвращать то, что он хотел вернуть. – Ilion

+0

На самом деле, я полагаю, в этом случае внешний вид не нужен. – Ilion

0

Я могу думать о двух способов

  • Использование групп (routerbl) (router0000) и использовать первую группу
  • Положительный lookahead: routerbl (?=router000)
1

Это не ответ на ваш вопрос о регулярных выражениях, но если только правило, чтобы вернуть первую часть вашей строки до определенной подстроки, то вы могли бы использовать что-то более простое, чем регулярное выражение:

string test = "routerbl router0000;"; 
string matchingValue = "router000"; 

int matchingValueIndex = test.IndexOf(matchingValue); 
string leftPart; 
if (matchingValueIndex >= 0) 
{ 
    leftPart = test.Substring(0, matchingValueIndex); 
} 
0

Используйте выражение (.*)(?=\srouter0000), чтобы найти текст перед текстом router0000.

string resultString = null; 
try 
{ 
    resultString = Regex.Match(part, @"(.*)(?=\srouter0000)", RegexOptions.Multiline).Value; 
} catch (ArgumentException ex) 
{ 
    // Syntax error in the regular expression 
} 
+0

Хмм на самом деле решение @stema лучше, поскольку оно использует '\ S' вместо'. * ', Но идея такая же. – Aphelion

+1

Я думаю, что '. *' - лучший ответ, потому что он принимает меньше о требованиях, которые не задавал вопросник. –

Смежные вопросы