नियमित अभिव्यक्ति का उपयोग करके एसक्यूएल कीवर्ड को कैसे उजागर करें?

वोट
31

मैं वाक्यविन्यास हाइलाइटर में एक स्ट्रिंग के भीतर होने वाले एसक्यूएल कीवर्ड को उजागर करना चाहूंगा। यहां वे नियम हैं जो मैं करना चाहता हूं:

  • कीवर्ड का चयन करें से चयन करें और FROM (दूसरों को जोड़ा जाएगा, लेकिन हम यहां शुरू करेंगे)। ऑल-कैप होना चाहिए
  • एक स्ट्रिंग में समाहित होना चाहिए - या तो साथ शुरू करना ' या
  • उस स्ट्रिंग में पहला शब्द (व्हॉट्सएप को अनदेखा करने से पहले) कीवर्ड में से एक होना चाहिए।

यह निश्चित रूप से व्यापक नहीं है (एक स्ट्रिंग के भीतर भागने को अनदेखा कर सकता है), लेकिन मैं यहां शुरू करना चाहता हूं।

कुछ उदाहरण निम्नलिखित हैं:

  • चयन करें * मुख्य से - मेल नहीं खाएगा (एक स्ट्रिंग में नहीं)
  • "मुख्य में से नाम चुनें" - से मेल खाएगी
  • "
    मुख्य नाम से चयन करें "- मेल खाएगा
  • "" "यहाँ एक SQL कथन है:

चयन करें * मुख्य "" से - नहीं, स्ट्रिंग एक खोजशब्द (SELECT ...) से शुरू नहीं होती है।

एकमात्र तरीका मैंने इसे एक एकल रेगेक्स में करने का सोचा था जो एक नकारात्मक खोज के साथ होगा ... लेकिन तब यह निश्चित चौड़ाई नहीं होगी, क्योंकि हम नहीं जानते कि स्ट्रिंग कब शुरू होती है। कुछ इस तरह:

लेकिन यह काम नहीं करेगा:

यहाँ

क्या ऐसा कुछ एकल रेगेक्स में करना संभव होगा?

25/05/2020 को 00:37
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


3 जवाब

वोट
0

एक उपयुक्त नियमित अभिव्यक्ति को बहुत जटिल होने की संभावना है, खासकर जब नियम आगे विकसित होते हैं। जैसा कि दूसरों ने नोट किया है, इसके बजाय एक पार्सर का उपयोग करने पर विचार करने के लायक हो सकता है। उन्होंने कहा, यहां अब तक उल्लिखित नियमों को कवर करने का एक संभावित रेगेक्स है:

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

नियमित अभिव्यक्ति दृश्य

ऑनलाइन डेमो

  1. डीबगेजक्स डेमो
  2. Regex101 डेमो

व्याख्या

जैसा कि उपरोक्त दृश्य में देखा जा सकता है, रेगेक्स शुरू में एक डबल या सिंगल उद्धरण के लिए दिखता है (समूह # 1 को कैप्चर करने में सहेजा गया है) और फिर इस संदर्भ के माध्यम से अंत में मेल खाता है \1SELECT तथा FROM कीवर्ड # 2 और # 3 को कैप्चर करने वाले समूहों में कैद हैं। ( ?:(x|y) वाक्यविन्यास सुनिश्चित करता है कि अन्य विकल्पों के लिए अधिक समूह नहीं हैं ?: पसंद की शुरुआत में इसे कैप्चरिंग ग्रुप के रूप में शामिल नहीं किया जाता है।) कुछ और वैकल्पिक विवरण हैं जैसे कि सीमित करने की अनुमति है SELECT तथा FROM और अंतिम उद्धरण चिह्न की गिनती नहीं करना अगर यह एक शब्द चरित्र द्वारा तुरंत सफल होता है।

परिणाम

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
31/05/2020 को 13:55
का स्रोत उपयोगकर्ता

वोट
0

आप कैप्चरिंग समूहों का उपयोग कर सकते हैं:

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

इस मामले में $ 2 पहले कीवर्ड को संदर्भित करेगा और $ 3 दूसरे कीवर्ड को संदर्भित करेगा। यह भी केवल तभी काम करता है जब एक पंक्ति में केवल दो कीवर्ड और केवल एक स्ट्रिंग हो, जो आपके सभी उदाहरणों में सही प्रतीत होता है, लेकिन यदि वे प्रतिबंध आपके लिए काम नहीं करते हैं, तो मुझे बताएं।

28/05/2020 को 19:39
का स्रोत उपयोगकर्ता

वोट
0

बस regexp bellow का परीक्षण किया:

यहाँ छवि विवरण दर्ज करें

यदि आपको अन्य आदेशों को जोड़ने की आवश्यकता है तो बात थोड़ी मुश्किल हो सकती है, क्योंकि कुछ खोजशब्द लागू नहीं होते हैं। जैसे: माईटेबल या अपडेट सेट कॉल = वाल; इन परिदृश्यों के लिए आपको उपसमूह बनाने की आवश्यकता होगी और regexp धीमा हो सकता है।

सादर!

28/05/2020 को 21:19
का स्रोत उपयोगकर्ता

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