c # Поиск строки, содержащей кавычки - PullRequest
0 голосов
/ 09 марта 2012

Я довольно новичок в 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 ]

2 голосов
/ 09 марта 2012

Вы должны изменить свой метод так:

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 голосов
/ 09 марта 2012

Так что я думаю, что вы можете использовать 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 "";
    }
}
...