2012-03-09 3 views
0

Я довольно новичок в C#, и я работаю над небольшим проектом, но застрял на этом. У меня есть файл, содержащий некоторый код сборки. Я хочу, чтобы моя программа искала этот файл для строки, на самом деле значение сразу после моей строки. Одна из строк я ищу это:C# Поиск строки, содержащей цитаты

setproperty   QName(PackageNamespace(""), "font") 

    getlocal   4 
    pushint    

Мой поиск кода заключается в следующем:

private void searchFile(String searchText) 
    { 
     System.IO.StreamReader reader = new System.IO.StreamReader(file); 
     String text = reader.ReadToEnd(); 
     if (Regex.IsMatch(text, searchText)) 
     { 
      MessageBox.Show(searchText + " was found in the given file", "Finally!!"); 
     } 
     else 
     { 
      MessageBox.Show("Sorry, but " + searchText + " could not be found in the given file", "No Results"); 
     } 
    } 

    //when i click a button// 
    searchFile(@"setproperty   QName(PackageNamespace(""""), ""font"") 

    getlocal   4 
    pushint    "); 

Я знаю, что строка в файле, но результат придумывает не найден. Я не знаю, являются ли это кавычками или вкладками или и тем, и другим, что вызывает это.

Вот часть файла:

getlocal   4 
    pushstring   "Verdana" 
    setproperty   QName(PackageNamespace(""), "font") 

    getlocal   4 
    pushint    16764170 
    setproperty   QName(PackageNamespace(""), "color") 

    getlocal   4 
    pushbyte   12 
    setproperty   QName(PackageNamespace(""), "size") 

Мой второй вопрос заключается в том, как я могу получить значение первого междунар после моего результата поиска?

Заранее спасибо.

-Leen

ответ

2

Вы должны изменить способ, как это:

private static string searchFile(String searchText) 
    { 
     System.IO.StreamReader reader = new System.IO.StreamReader("test.txt"); 
     String text = reader.ReadToEnd(); 
     int poz = text.IndexOf(searchText); 
     if (poz >= 0) 
     {     
      int start = poz + searchText.Length; 
      int end = text.IndexOf("\n", start); 
      Console.WriteLine(searchText + " was found in the given file", "Finally!!"); 
      return text.Substring(start, end - start); 
     } 
     else 
     { 
      Console.WriteLine("Sorry, but " + searchText + " could not be found in the given file", "No Results"); 
      return string.Empty; 
     } 
    } 

Вызов:

string val = searchFile("setproperty   QName(PackageNamespace(\"\"), \"font\")\r\n\r\n getlocal   4\r\n pushint    "); 
+0

Большое спасибо , Это не совсем сработало сразу, но мне удалось исправить это, изменив строку поиска на: string val = searchF ile ("setproperty QName (PackageNamespace (\" \ "), \" font \ ") \ n \ n getlocal 4 \ n pushint") ;. Он фактически находит строку сейчас. У меня все еще есть одна ошибка. return text.Substring (начало, конец - начало); : Длина не может быть меньше нуля. –

+0

вы можете попробовать с этой новой версией – ionden

+0

Perfect. Огромное спасибо. –

0

Так что я думаю, что вы можете быть использованы для VB.NET. Языки на основе C (например, C#) использовали символ обратной косой черты «\» в качестве escape-символа. . Таким образом, в поиске для двойной кавычки в строку, которую вы должны были бы избежать его, используя \»

Я считаю, что вы ищете это:

searchFile(@"setproperty   QName(PackageNamespace(\"\"), \"font\") 

    getlocal   4 
    pushint    "); 

Но это не совсем . регулярное выражение, которое является то, что класс Regex предназначен для так что я бы (ну не очень, я бы очистить его вверх немного, как не смешивать мой интерфейс и bizlogic) это сделать:

// Added String as the function type so you can return the matched "Integer" as a string, you could always do a Int32.TryParse(...) 
private String searchFile(String file, String searchText) 
{ 
    System.IO.StreamReader reader = new System.IO.StreamReader(file); 
    String text = reader.ReadToEnd(); 

    int32 index = text.IndexOf(searchText); 

    if (index >= 0) //We could find it at the very beginning 
    { 
     MessageBox.Show(searchText + " was found in the given file", "Finally!!"); 

     int32 start = index + searchText.Length; 
     int32 end = Regex.Match(text, "[\n\r\t]", index).Index; // This will search for whitespace 

     String value = text.Substring(start, end - start); 
     // Now you can do something with your value, like... 
     return value; 
    } 
    else 
    { 
     MessageBox.Show("Sorry, but " + searchText + " could not be found in the given file", "No Results"); 
     return ""; 
    } 
} 
+0

Спасибо за быстрый ответ. Имея строку поиска, как у вас, она даст новую строку в постоянной ошибке. –

+0

"экранируются с помощью" "в C#, если это текстовый литерал (то есть @" ... ") –

+0

@ Rune Huh. Вы узнаете что-то новое каждый день. Спасибо! –