Szukanie stringów w postaci ""

0

Hej,
mam taki problem dopiero zaczynam pisać w C# i staram się zrobić taki programik wczytujacy plik .cs i w nim wyszukujacy wszytkie stringi.na razie wykorzsałem Regex match jednak jezeli mam kilka stringów w jednej lini to juz nie dziala :/
MatchCollection matches = Regex.Matches(line, @"(?<="").*(?="") ");

np.

MessageBox.Show("Lista zamówień.", "Lista");
MsgBox.ShowBox(this, "Brak szczegółowych informacji o zamówieniu nr: " + zamów, "Szczegóły" + shopOrderSn);

no i chciałbym wynik :
Lista zamówień
Lista
Brak szczegółowych informacji o zamówieniu nr:
Szczegóły

Powiem ze wykorzystalem czytanie linia po lini, teraz mi przyszedl pomysl zeby napisac funkje czytaja znak po znaku
Ale jezeli ma ktoś prosty i fajny sposób to niech się podzieli

0

sprawdź to

http://msdn.microsoft.com/en-us/library/system.io.streamreader.aspx

jeżeli używasz stramreadera to zobacz metodę Read()

1

Nie znam się na C#, ale jeśli używa takich samych wyrażeń regularnych jak Java, to ignorując niesparowane znaki " w komentarzach, opisany efekt możesz osiągnąć przez wykorzystanie wyrażenia:
\"(.*?)\".
Wyrażenie to nie zadziała również przy takim czymś: "\""

3

Krótko mówiąc: potrzebujesz parser. Możesz bawić się w pisanie własnego, ale nie jest to prosta sprawa. Bo jak już nawet napiszesz swoje wyrażenie regularne, zaczną się pojawiać problemy, których za pomocą wyrażeń regularnych rozwiązać się nie da. Z bardzo prostej przyczyny: poszczególne elementy w kodzie źródłowym zmieniają swoje znaczenie w zależności od kontekstu. Np. znak " w zależności od tego gdzie jest, co jest obok niego, ma różne znaczenia. No i tutaj potrzebujemy już coś, co potrafi zapamiętywać stany i tak dalej i tak dalej i dlatego typowe parsery mają po kilka, kilkanaście, a nawet kilkadziesiąt tysięcy linijek. Oczywiście Twój parser byłby prostszy, ale..

Możesz też skorzystać z gotowego parsera i przeszukać drzewo, które wygeneruje. Microsoft udostępnia cały kompilator (a jednym z jego elementów jest parser), który można użyć w swoim programie. Ściągasz sobie "Microsoft Roslyn" i za pomocą takiego kodu można uzyskać wszystkie literały tekstowe w danym pliku źródłowym:

namespace StringLookup
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.IO;
    using Roslyn.Compilers.CSharp;

    class Program
    {
        static void Main(string[] args)
        {
            string sourceCode = File.ReadAllText(@"sciezka np do tego pliku");
            var syntaxTree = SyntaxTree.ParseCompilationUnit(sourceCode);

            var someArray = new string[] { "tekst1", "tekst2" };

            var strings = GetStrings(syntaxTree.GetRoot());

            foreach (string @string in strings)
                Console.WriteLine(@string);
        }

        public static IEnumerable<string> GetStrings(SyntaxNode syntaxNode)
        {
            var strings = new List<string>();

            foreach (SyntaxNode childNode in syntaxNode.ChildNodes())
            {
                if (childNode is LiteralExpressionSyntax && childNode.Kind == SyntaxKind.StringLiteralExpression)
                {
                    var token = childNode.DescendantTokens().FirstOrDefault();

                    strings.Add(token.GetText());
                }
                else
                    strings.AddRange(GetStrings(childNode));
            }

            return strings;
        }
    }
}

Co ważne - gdyby potrzebny był ci kontekst, w którym znajdują się poszczególne literały, możesz go za pomocą odpowiednich obiektów zbadać.

0
Oak napisał(a):

Nie znam się na C#, ale jeśli używa takich samych wyrażeń regularnych jak Java, to ignorując niesparowane znaki " w komentarzach, opisany efekt możesz osiągnąć przez wykorzystanie wyrażenia:
\"(.*?)\".
Wyrażenie to nie zadziała również przy takim czymś: "\""

Dzięki o to mi chodziło

0
Rev napisał(a):

Krótko mówiąc: potrzebujesz parser. Możesz bawić się w pisanie własnego, ale nie jest to prosta sprawa. Bo jak już nawet napiszesz swoje wyrażenie regularne, zaczną się pojawiać problemy, których za pomocą wyrażeń regularnych rozwiązać się nie da. Z bardzo prostej przyczyny: poszczególne elementy w kodzie źródłowym zmieniają swoje znaczenie w zależności od kontekstu. Np. znak " w zależności od tego gdzie jest, co jest obok niego, ma różne znaczenia. No i tutaj potrzebujemy już coś, co potrafi zapamiętywać stany i tak dalej i tak dalej i dlatego typowe parsery mają po kilka, kilkanaście, a nawet kilkadziesiąt tysięcy linijek. Oczywiście Twój parser byłby prostszy, ale..

Możesz też skorzystać z gotowego parsera i przeszukać drzewo, które wygeneruje. Microsoft udostępnia cały kompilator (a jednym z jego elementów jest parser), który można użyć w swoim programie. Ściągasz sobie "Microsoft Roslyn" i za pomocą takiego kodu można uzyskać wszystkie literały tekstowe w danym pliku źródłowym:

namespace StringLookup
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.IO;
    using Roslyn.Compilers.CSharp;

    class Program
    {
        static void Main(string[] args)
        {
            string sourceCode = File.ReadAllText(@"sciezka np do tego pliku");
            var syntaxTree = SyntaxTree.ParseCompilationUnit(sourceCode);

            var someArray = new string[] { "tekst1", "tekst2" };

            var strings = GetStrings(syntaxTree.GetRoot());

            foreach (string @string in strings)
                Console.WriteLine(@string);
        }

        public static IEnumerable<string> GetStrings(SyntaxNode syntaxNode)
        {
            var strings = new List<string>();

            foreach (SyntaxNode childNode in syntaxNode.ChildNodes())
            {
                if (childNode is LiteralExpressionSyntax && childNode.Kind == SyntaxKind.StringLiteralExpression)
                {
                    var token = childNode.DescendantTokens().FirstOrDefault();

                    strings.Add(token.GetText());
                }
                else
                    strings.AddRange(GetStrings(childNode));
            }

            return strings;
        }
    }
}

Co ważne - gdyby potrzebny był ci kontekst, w którym znajdują się poszczególne literały, możesz go za pomocą odpowiednich obiektów zbadać.

Zaciekawiło mnie, jako calkiem nowe rozwiązanie, próbuje coś wykombinować zobaczymy co wyjdzie

1 użytkowników online, w tym zalogowanych: 0, gości: 1