2010-11-18 14 views

cevap

5

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.

+0

Sanırım \ s + 'yı, pozitif lookbehind – pastacool

+0

evet'e taşımanız gerekiyor. İyi öneri –

+1

-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. –

-1
(from|join)\s(\w+) 
+0

Hayır. Bu, yalnızca "from" veya "table_name" ile eşleşecek, ancak "table_name" ile eşleşmeyecek. Boru sadece ilk parçayı değil, tüm deseni ayırır. – tdammers

+0

Hmm. Yani, herhangi bir parantez ile bir şeyler paylaşabilir miyim? – NLV

1

şey:

/(from|join)\s+(\w*\.)*(?<tablename>\w+)/ 

olsa tablo isimleri kaçmış eşleşmeyecektir ve regex değerlendirme harf duyarsız yapmak gerekir.

+0

Üzgünüm. Bir eşleşme bile dönmüyor. – NLV

+0

kesinlikle yanlış. Bu tür regex ile tablo isimlerini bulamıyorsunuz. Kelimeleri birleştirip de eşleştireceksiniz. Sadece tablo isimleri değil. –

+1

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

2

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

+0

bu

nedir? – NLV

+0

kesinlikle yanlış. Tablo isimlerini böyle regex –

+0

yep ile bulamazsınız, bir şey unuttum. – Simone

İlgili konular