Çok sayıda sorgu içeren bir metin dosyası yapıyorum. Tüm sorgularda tüm dosyada kullanılan tüm farklı tabloları almak istiyorum. Tablo adı bir 'from' veya 'join' sonra gelebilir. Bir regex eşleştirmesi yaparak bunları nasıl çıkarabilirim. Birileri maçları almak için düzenli bir ifade önerebilir mi? Belki de bu kadarSQL sorguları içeren bir dosyadan tablo adlarını ayıklamak için Regex'i kullanma
cevap
Dosyanızın yapısına bağlıdır. Bu kullanmayı deneyin:
(?<=from|join)(\s+\w+\b)
Ayrıca seçenekleri açmak senin dizi veya tekli dize üyeleri ile Tavsiyen başka dosyanızı bölmek değilse satırlı. Ayrıca IgnorCase seçeneğini açmayı deneyin.
şey:
/(from|join)\s+(\w*\.)*(?<tablename>\w+)/
olsa tablo isimleri kaçmış eşleşmeyecektir ve regex değerlendirme harf duyarsız yapmak gerekir.
Üzgünüm. Bir eşleşme bile dönmüyor. – NLV
kesinlikle yanlış. Bu tür regex ile tablo isimlerini bulamıyorsunuz. Kelimeleri birleştirip de eşleştireceksiniz. Sadece tablo isimleri değil. –
Bunu test etmedim, ancak her bir 'from' veya 'join' oluşumuyla eşleşmeli, ardından en az bir beyaz boşluk ve ardından bir veya daha fazla tanımlayıcı noktalarla ayrılmalıdır. Ancak bir hata var; Bir kelime başlangıcı iddiasıyla başlamalıdır, aksi takdirde “foobarfrom blah” gibi şeylerle de eşleşecektir. Ve bu kaçınarak dikkate almaz, çünkü bu DBMS'ye özgü bir şeydir - MySQL backquotes kullanır, PostgreSQL çift tırnak kullanır, T-SQL köşeli parantezleri kullanır. – tdammers
Kullanayım: Eğer Match nesnesi "m" bir kez
r = new Regex("(from|join)\s+(?<table>\S+)", RegexOptions.IgnoreCase);
, tablo adını gerekecek
m.Groups["table"].Value
örnekle:
string line = @"select * from tb_name join tb_name2 ON a=b WHERE x=y";
Regex r = new Regex(@"(from|join)\s+(?<table>\S+)",
RegexOptions.IgnoreCase|RegexOptions.Compiled);
Match m = r.Match(line);
while (m.Success) {
Console.WriteLine (m.Groups["table"].Value);
m = m.NextMatch();
}
yazdıracaktır: tb_table tb_table2
bu
Sanırım \ s + 'yı, pozitif lookbehind – pastacool
evet'e taşımanız gerekiyor. İyi öneri –
-1 Bu sorunu çözmek için Regex doğru yol değildir. Kullanıcıların belirttiği gibi, bu problemi etkili bir şekilde çözmek için bazı açıklamaların bir SQL ayrıştırıcısı gereklidir. –