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:
Kopiuj
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ć.