Normal bir ifade kullanarak SQL anahtar kelimeleri nasıl vurgulanır?

oy
34

Bir sözdizimi vurgulayıcı bir dize içinde oluşan SQL anahtar kelimeler vurgulamak istiyorum. İşte sahip olmak istediğim kurallar:

  • SELECT ve FROM anahtar kelimelerini eşleştirin (diğerleri eklenir, ancak buradan başlayacağız). Tamamen büyük harf olmalı
  • Bir dizede bulunmalıdır - ya ' veya
  • Bu dizgideki ilk kelime (kendisinden önceki boşlukları yoksayarak) anahtar kelimelerden biri olmalıdır.

Bu elbette kapsamlı değil (bir dize içindeki kaçışları görmezden gelebilir), ama buradan başlamak istiyorum.

İşte birkaç örnek:

  • SELECT * FROM main - eşleşmeyecek (bir dizede değil)
  • "Ana DAN adını SEÇ" - maç olacak
  • "
    Main from FROM SELECT name - eşleşecek
  • "" "İşte bir SQL ifadesi:

SELECT * FROM ana "" "- hayır, dize bir anahtar sözcükle (SELECT ...) başlamıyor.

Tek bir regex'te yapmayı düşündüğüm tek yol, negatif bir bakış açısıyla olurdu ... ama sonra dize ne zaman başladığını bilmediğimiz için sabit genişlik olmazdı. Gibi bir şey:

Ancak bu elbette işe yaramaz:

resim

Bunun gibi bir şeyin tek bir regex'te yapılması mümkün müdür?

Oluştur 25/05/2020 saat 00:37
kaynak kullanıcı
Diğer dillerde...                            


3 cevaplar

oy
0

Uygun bir ifade, özellikle kurallar daha da geliştikçe oldukça karmaşık hale gelecektir. Diğerlerinin belirttiği gibi, bunun yerine bir ayrıştırıcı kullanmayı düşünmeye değer olabilir. Bununla birlikte, şu ana kadar bahsedilen kuralları kapsamak isteyen bir olası regex:

(["'])\s*(SELECT)(?:\s+|\s.*\s)(FROM)(?:\s+.*)?\1(?:[^\w]|$)

Düzenli ifade görselleştirme

Online Tanıtımlar

  1. Debuggex Demosu
  2. Regex101 Gösteri

açıklama

Yukarıdaki görselleştirmede görülebileceği gibi, normal ifade başlangıçta çift veya tek bir teklif arar (yakalama grubu # 1'e kaydedilir) ve daha sonra bu referansı \1 . SELECT ve FROM anahtar kelimeler # 2 ve # 3 gruplarını yakalar. ( ?:(x|y) sözdizimi, diğer seçenekler için daha fazla grup olmamasını sağlar. ?: bir seçimin başlangıcında onu bir yakalama grubu olarak hariç tutar.) SELECT ve FROM ve bir kelime karakteri tarafından hemen yerine getirilirse, son tırnak işaretini saymamak.

Sonuçlar

SELECT * FROM tbl        -- no match - not in a string
"SELECT * FROM tbl"      -- matches - in a double-quoted string
'SELECT * FROM tbl;'     -- matches - in a single-quoted string
'SELECT * FROM it's      -- no match - letter after end quote
"SELECT * FROM tbl'      -- no match - quotation marks don't match
'SELECT * FROM tbl"      -- no match - quotation marks don't match
"select * from tbl"      -- no match - keywords not upper case
'Select * From tbl'      -- no match - still not all upper case
"SELECT col1 FROM"       -- matches - even though no table name
'  SELECT  col1  FROM '  -- matches - as above with more whitespace
'SELECT col1, col2 FROM' -- matches - with multiple columns
Cevap 31/05/2020 saat 13:55
kaynak kullanıcı

oy
0

Yakalama gruplarını kullanabilirsiniz:

(.*["']\s*\K)(?(1)(SELECT|FROM).*(SELECT|FROM)|)

Bu durumda $ 2 ilk anahtar kelimeyi, 3 $ ikinci anahtar kelimeyi belirtir. Bu, yalnızca tüm örneklerinizde doğru gibi görünen bir satırda yalnızca iki anahtar kelime ve yalnızca bir dize varsa çalışır, ancak bu kısıtlamalar sizin için işe yaramıyorsa bana bildirin.

Cevap 28/05/2020 saat 19:39
kaynak kullanıcı

oy
0

Sadece regexp feryatını test ettim:

resim açıklamasını buraya girin

Başka komutlar eklemeniz gerekiyorsa, bazı anahtar kelimeler geçerli olmadığından, bu işlem biraz hile yapabilir. Örneğin: ALTER TABLE mytable veya UPDATE SET col = val ;. Bu senaryolar için alt gruplar oluşturmanız gerekir ve normal ifade yavaşlayabilir.

Saygılarımla!

Cevap 28/05/2020 saat 21:19
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more