PDA

View Full Version : سوال: ایجاد یک لیست از کلمات کلیدی و تشخیص آن در متن



ROSTAM2
چهارشنبه 20 مهر 1401, 22:54 عصر
با سلام.

من یکسری کلمات کلیدی رو به آرایه دادم و روش من برای تشخیص وجود اون کلمه کلیدی در متن اصلی استفاده از حلقه بوده آیا روش ساده تری هم وجود داره البته من از طریق LINQ نتونستم با آرایه به نتیجه برسم.


Function ISKeyWord(ByRef Value As String) As Boolean
Dim KeyWords() = {"FROM", "AS", "WHERE", "IS", "SELECT", "ALL"}
For Each Word As String In KeyWords
If Value.ToUpper.CompareTo(Word) = 0 Then
Value = Word
Return True
End If
Next
Return False
End Function



روش دوم استفاده از فیلتر بود به اینصورت که اصولی نیست:


Function ISKeyWord(ByRef Value As String) As Boolean
Dim KeyWords() = {"FROM", "AS", "WHERE", "IS", "SELECT", "ALL"}
Dim Expr() As String = Filter(KeyWords, Value.ToUpper, True, CompareMethod.Binary)
If Expr.Length > 0 Then
Value = Expr(0)
Return True
End If
Return False
End Function

mazoolagh
پنج شنبه 21 مهر 1401, 10:20 صبح
سلام و روز خوش
اگر آرایه رو به لیست تبدیل کنین (با متد tolist) بعد میتونین با contains چک کنین.

mazoolagh
پنج شنبه 21 مهر 1401, 10:28 صبح
Function ISKeyWord(ByRef Value As String) As Boolean
Dim KeyWords() = {"FROM", "AS", "WHERE", "IS", "SELECT", "ALL"}
Return KeyWords.ToList.Contains(Value)
End Function

mazoolagh
پنج شنبه 21 مهر 1401, 10:58 صبح
یادم نبود؛
بجای این که کلمات رو در آرایه بریزین و بعد به لیست تبدیل کنین،مستقیما هم میتونین لیست رو initialize کنین:

Function ISKeyWord(ByRef Value As String) As Boolean
Dim KeyWords As New List(Of String)({"FROM", "AS", "WHERE", "IS", "SELECT", "ALL"})
Return KeyWords.Contains(Value)
End Function

ROSTAM2
پنج شنبه 21 مهر 1401, 11:27 صبح
خوبه دستت درد نکنه.
ی موردی که هست من می خوام مقدار ورودی Value ارجاع داده بشه به متغیر و نیاز دارم که نحوه نوشتاری کلمه (بزرگی و کوچکی حروف) رو پس بگیرم تا اگه کاربر هر نوشتاری داشته برگرده به حالت نوشتاری لیست.
این که می شه از لیست استفاده کرد مناسبه و فکر کنم از متد ToList از آرایه برای استفاده از LINQ بشه نتیجه مطلوب رو گرفت که کلمه کلیدی اصلی هم ارجاع داده بشه.

ممنون.

mazoolagh
پنج شنبه 21 مهر 1401, 12:31 عصر
بله، چون contains به کوچک/بزرگ بودن حساس هست (case sensitive) ، میشه تابع رو به شکل زیر اصلاح کنین:
Dim KeyWords As New List(Of String)({"FROM", "AS", "WHERE", "IS", "SELECT", "ALL"})
Function ISKeyWord(ByRef Value As String, Optional CaseSensitive As Boolean = False) As Boolean
If CaseSensitive Then
Return KeyWords.Contains(Value)
Else
Return KeyWords.ConvertAll(Function(KW) KW.ToUpper).Contains(Value.ToUpper)
End If
End Function

البته اگه همیشه مطمئن هستین که همه المانهای لیست uppercase هست دیگه نیازی به ConvertAll(Function(KW) KW.ToUpper) نیست.

154069

ROSTAM2
پنج شنبه 21 مهر 1401, 17:58 عصر
برای اینکه موضوع روشن بشه بیشتر توضیح می دم:

1- با زدن کلید Space از صفحه کلید کلمه ای که کاربر نوشته قبل از درج فاصله در متن چک می شه که در اینجا از تابع LastWord استفاده شده یعنی آخرین کلمه از کل متن: و همچنین متغیر QueryText یک رشته است که کل متن رو در بر می گیره و LastWord d یک Extension Method برای String هست.



Select Case Key.Key
Case ConsoleKey.Spacebar
LastWord = QueryText.LastWord
CurrentPos = Console.CursorLeft
If ISKeyWord(LastWord) = True Then
Console.CursorLeft = (CurrentPos - LastWord.Length)
Console.ForegroundColor = ConsoleColor.Blue
Console.Write("{0}", LastWord)
Console.ResetColor()
End If
End Select




2- این هم تابع LastWord که آخرین کلمه از متن رو برمی گردونه:



<Extension()> Function LastWord(str As String) As String
If str.EndsWith(Space(1)) = True Then Return ""
Dim spl() As String = str.Split(Space(1))
If spl.Length > 0 Then
Return spl(spl.Length - 1)
End If
Return ""
End Function


3- بعد از گرفتن آخرین کلمه از متن با تابع ISKeyWord چک می کنیم که این کلمه در کلمات کلیدی وجود داره یا نه اگر وجود داشته مقدار True رو بر می گردونه و چیزی که خواسته دیگه از این تابع هست برگردوندن مقدار اصلی کلمه کلیدی که در آرایه قرار داره برای همین هم متغیر LastWord که به ورودی تابع ISKeyWord داده شده از ونجایی که این ورودی ByRef تعریف شده مقدارش در خود تابع IsKeyWord تغییر می کنه چرا که باید جایگزین کلمه آخر از متن بشه و نحوه نوشتاری اون به شکل کلمه کلیدی اصلی زبان مورد نظر بشه و مطمئنا رنگ هم بگیره البته این در کنسول اپ هست (به فرض مثال SQL.)



Select Case Key.Key
Case ConsoleKey.Spacebar
LastWord = QueryText.LastWord
CurrentPos = Console.CursorLeft
If ISKeyWord(LastWord) = True Then
Console.CursorLeft = (CurrentPos - LastWord.Length)
Console.ForegroundColor = ConsoleColor.Blue
Console.Write("{0}", LastWord)
Console.ResetColor()
End If
End Select
Console.Write(Key.KeyChar)
QueryText += Key.KeyChar
GoTo ReadKey


4- این هم تابع ISKeyWord که از دستور LINQ برای جستجوی کلمه در لیست استفاده می کنه که بنظرم همون حلقه fOR Each...Next ساده تر از این باشه:



Function ISKeyWord(ByRef Value As String) As Boolean
Dim KeyWords() As String = {"FROM", "AS", "WHERE", "IS", "SELECT", "ALL"}


Dim MyWord As String = Value
Dim Words = From Word In KeyWords Where String.Compare(Word, MyWord, True) = 0


If Words.Count > 0 Then
Value = Words.First
Return True
End If
Return False
End Function


مشکلی که کد من داشت و نمی تونستم از linq استفاده کنم این بود که حواسم به نسخه dotnet نبود و ریفرنس linq رو اضافه نکرده بودم.
و مهم برای من مقدار دادن به ورودی Value هم بود با وجود اینکه می خواستم کدش ساده تر باشه اما بنظر همون حلقه For Each...Next بهتر بود.



Function ISKeyWord(ByRef Value As String) As Boolean
Dim KeyWords() = {"FROM", "AS", "WHERE", "IS", "SELECT", "ALL"}
For Each Word As String In KeyWords
If Value.ToUpper.CompareTo(Word) = 0 Then
Value = Word
Return True
End If
Next
Return False
End Function


که مشکل دیگه ای که وجود داشت در استفاده از LINQ ورودی Value رو چون ByRef بود قبول نمی کرد. و بنظر همون دستور اول بهتر بود:

154070

ROSTAM2
پنج شنبه 21 مهر 1401, 21:21 عصر
آخرین تغییرات در LastWord Extension Method:
با این تغیییرات اگر متن خط به خط نوشته شده باشه هم پشتیبانی می شه که توی پست قبل ناقص هست.



<Extension()> Function LastWord(str As String) As String
If str.EndsWith(Space(1)) = True Then Return ""
Dim Lines() As String = str.Split(Chr(10), Chr(13))
If Lines.Length = 0 Then Return ""
Dim spl() As String = Lines(Lines.Length - 1).Split(Space(1))
If spl.Length > 0 Then
Return spl(spl.Length - 1)
End If
Return ""
End Function

mazoolagh
شنبه 23 مهر 1401, 10:29 صبح
بسیار عالی!

در کد تابع lastword یک موردی هست:
<Extension()> Function LastWord(str As String) As String
If str.EndsWith(Space(1)) = True Then Return ""
Dim spl() As String = str.Split(Space(1))
If spl.Length > 0 Then
Return spl(spl.Length - 1)
End If
Return ""
End Function

اگر در str بجای یک space ، چند تا پشت سر هم باشه و یا بین wordها از tab یا crlf استفاده شده باشه،
دیگه نمیشه از str.split(space(1)) استفاده کرد چون درست تشخیص نمیده.

گذشته از این، اگر str خودش شامل یک یا چند string درون "" یا '' باشه که داخل اون space باشه باز هم مشکل داریم.

من یک نمونه درست کردم که مشکل رو نشون بده:
Dim spl() As String = TB1.Text.Split(Space(1))
ListBox1.Items.Clear()
For i As Integer = 0 To UBound(spl)
ListBox1.Items.Add(spl(i))
Next
ListBox1.Items.Add("---END---")

154082

336699
یک شنبه 24 مهر 1401, 23:21 عصر
سلام
با استفاده از ریجکس می توان تمام حروف و کلمات موجود در متن مورد نظر را تبدیل به یک لیست نمود.

Dim rgx As Regex = New Regex("\w+")
Dim words = rgx.Matches(TextBox1.Text).
Cast(Of Match)().
Select(Function(a) a.Value.ToLowerInvariant()).
GroupBy(Function(b) b).
Select(Function(c) c.Key).ToList()

mazoolagh
دوشنبه 25 مهر 1401, 16:54 عصر
سلام
با استفاده از ریجکس می توان تمام حروف و کلمات موجود در متن مورد نظر را تبدیل به یک لیست نمود.

Dim rgx As Regex = New Regex("\w+")
Dim words = rgx.Matches(TextBox1.Text).
Cast(Of Match)().
Select(Function(a) a.Value.ToLowerInvariant()).
GroupBy(Function(b) b).
Select(Function(c) c.Key).ToList()

سلام و روز خوش
این پترن برای اینکار خیلی ابتدایی هست و فقط wordهایی رو تشخیص میده که alphanumeric باشن.
در حالت کلی بطور عام و دست کم برای این مسئله بطور خاص جوابگو نیست.
پترن(های) بمراتب پیچیده تری نیاز هست برای تشخیص عبارت های درون ' یا " و همینجور () و [] و کارآکترهایی نظیر @!%$#* و شاید چند بار باید پروسس بشه.
چیزی که رستم خان نیاز داره در حد یک parser باید باشه.

336699
دوشنبه 25 مهر 1401, 19:26 عصر
سلام و روز خوش
این پترن برای اینکار خیلی ابتدایی هست و فقط wordهایی رو تشخیص میده که alphanumeric باشن.
در حالت کلی بطور عام و دست کم برای این مسئله بطور خاص جوابگو نیست.
پترن(های) بمراتب پیچیده تری نیاز هست برای تشخیص عبارت های درون ' یا " و همینجور () و [] و کارآکترهایی نظیر @!%$#* و شاید چند بار باید پروسس بشه.
چیزی که رستم خان نیاز داره در حد یک parser باید باشه.

There is no silver bullet

هیچ محصول یا روش یا ترفندی وجود ندارد که بتواند نتایج موفقیت آمیز را تضمین کند.

mazoolagh
پنج شنبه 28 مهر 1401, 15:38 عصر
خب میدونیم که برای این مسئله از قبل پاسخ داریم که در همین محیط QUERY EDITOR برنامه MSSQLMS (و مشابه اون) پیاده شده.
چیزی که هست اینه که پاسخ مد نظر آقای ROSTAM2 پیچیده تر از یک split یا regex ساده است.

ولی حتی با یک پترن دیگه میشه خیلی نتایج بهتری گرفت،
و این که باید هر چه که درون ' ' یا [ ] هست از پردازش کنار گذاشته بشه.

سر فرصت یک نمونه میگذارم و حیف است که این تاپیک همینجا رها بشه.

mazoolagh
پنج شنبه 05 آبان 1401, 11:10 صبح
در ادامه بحث و این که چجوری باید از regex در این پرسش استفاده کرد؛

ابتدا باید بخشهایی رو که نباید پردازش بشن کنار بگذاریم:
1- کامنت ها
USE Nwind; -- SINGLE LINE COMMENT
/* MULILINE COMMENT LINE 1
MULTILINE COMMENT LINE 2 */

2- هر چه که درون ' ها (single quote) باشه یعنی stringها

N'John Smith'
'%s r%'

3- هر چه که درون " ها (double quote) باشه، البته اینها string نیستن ولی بعنوان جداکننده یا برای تعریف alias میتونن بکار برن
SELECT SUM(UnitsInStock) "Total Units In Stock" FROM Products
SELECT ProductID, "ProductName" AS "Product Name" FROM Products

4- هر چه که درون [] باشه
SELECT SUM(UnitsInStock) [Total Units In Stock] FROM Products
SELECT ProductID, [ProductName] AS [Product Name] FROM Products

برای شناسایی هر یک از اینها یک پترن جدا مینویسیم:
Const pt1 As String = "--.*[^\r\n]" ' -- (Singleline Comment)
Const pt2 As String = "/\*((?:.|\s)*?)\*/" ' /**/ (Multiline Comment)
Const pt3 As String = "[N]?'((?:.|\s)*?)'" ' Single Quotes
Const pt4 As String = "\u0022((?:.|\s)*?)\u0022" ' Double Quotes
Const pt5 As String = "\[((?:.|\s)*?)\]" ' []

mazoolagh
پنج شنبه 05 آبان 1401, 11:22 صبح
در مرحله بعد هر چه whitespace یعنی (tab, cr, lf, space)در اینها باشه یا یک کارآکتر که مطمئنیم در هیچ کد SQL دیده نمیشود جایگزین میکنیم (در اینجا ChrW(&HFFFD))
Const Pattern_Ignore = pt1 + "|" + pt2 + "|" + pt3 + "|" + pt4 + "|" + pt5
Dim strSQL As String = TB_Source.Text
Dim strMOD As String = strSQL
For Each m As Match In Regex.Matches(strMOD, Pattern_Ignore, RegexOptions.Multiline)
strMOD = strMOD.Remove(m.Index, m.Length)
strMOD = strMOD.Insert(m.Index, FillWhiteSpaces(m.Value))
Next


Function FillWhiteSpaces(str As String) As String
Return Regex.Replace(NZ(str), "\s", ChrW(&HFFFD))
End Function


Private Function NZ(str As String) As String
If String.IsNullOrEmpty(str) Then
Return String.Empty
Else
Return str
End If
End Function

mazoolagh
پنج شنبه 05 آبان 1401, 11:36 صبح
در گام بعدی در چپ و راست کارآکترهایی مثل () و اپراتورها (مثل = * / + و ...) یک space اضافه میکنیم تا مطمئن باشیم هیچ کلمه ای به اینها چسبیده نباشد
Dim x As List(Of Char) = "(),;!=<>+-*/%^|&~".ToList
For Each c In x
strMOD = strMOD.Replace(c, Blank + c + Blank)
Next

بعد همه spaceهای اضافه رو پاک میکنیم
strMOD = Regex.Replace(strMOD, "\s", Blank)
strMOD = Regex.Replace(strMOD, "[ ]{2,}", Blank)

mazoolagh
پنج شنبه 05 آبان 1401, 11:49 صبح
تازه الان هست که میتونیم کد رو split کنیم
Dim Words As List(Of String) = strMOD.Trim.Split(Blank).ToList

با این فرض که از پیش لیست کلمات کلیدی رو در SQL_KeyWords تعریف کردیم
و همچنین این موضوع که keywordهای SQL میتونن فقط شامل حرف یا _ یا @ باشن (تا اونجایی که من میدونم همینها هست، اگر چیز دیگه ای هم هست یادآوری کنین)
For Each word In Words
If Regex.IsMatch(word, "^[a-zA-Z_@]+$") Then
LB_Words.Items.Add(word)
If SQL_KeyWords.Contains(word.ToUpper) Then
LB_Keywords.Items.Add(word)
End If
End If
Next

mazoolagh
پنج شنبه 05 آبان 1401, 11:52 صبح
Imports System.Text.RegularExpressions
Public Class UsingRegEx
Const Blank As Char = ChrW(32)
Const pt1 As String = "--.*[^\r\n]" ' -- (Singleline Comment)
Const pt2 As String = "/\*((?:.|\s)*?)\*/" ' /**/ (Multiline Comment)
Const pt3 As String = "[N]?'((?:.|\s)*?)'" ' Single Quotes
Const pt4 As String = "\u0022((?:.|\s)*?)\u0022" ' Double Quotes
Const pt5 As String = "\[((?:.|\s)*?)\]" ' []
Const Pattern_Ignore = pt1 + "|" + pt2 + "|" + pt3 + "|" + pt4 + "|" + pt5


Private Sub Btn_Process_Click(sender As Object, e As EventArgs) Handles Btn_Process.Click
LB_Words.Items.Clear()
LB_Keywords.Items.Clear()
Dim strSQL As String = TB_Source.Text
Dim strMOD As String = strSQL
For Each m As Match In Regex.Matches(strMOD, Pattern_Ignore, RegexOptions.Multiline)
strMOD = strMOD.Remove(m.Index, m.Length)
strMOD = strMOD.Insert(m.Index, FillWhiteSpaces(m.Value))
Next
TB_Modified.Text = strMOD
'strMOD = Regex.Replace(strSQL, pattern, String.Empty)
Dim x As List(Of Char) = "(),;!=<>+-*/%^|&~".ToList
For Each c In x
strMOD = strMOD.Replace(c, Blank + c + Blank)
Next
strMOD = Regex.Replace(strMOD, "\s", Blank)
strMOD = Regex.Replace(strMOD, "[ ]{2,}", Blank)
Dim Words As List(Of String) = strMOD.Trim.Split(Blank).ToList
For Each word In Words
If Regex.IsMatch(word, "^[a-zA-Z_@]+$") Then
LB_Words.Items.Add(word)
If SQL_KeyWords.Contains(word.ToUpper) Then
LB_Keywords.Items.Add(word)
End If
End If
Next
End Sub

Function FillWhiteSpaces(str As String) As String
Return Regex.Replace(NZ(str), "\s", ChrW(&HFFFD))
End Function

Private Function NZ(str As String) As String
If String.IsNullOrEmpty(str) Then
Return String.Empty
Else
Return str
End If
End Function
End Class

mazoolagh
پنج شنبه 05 آبان 1401, 11:56 صبح
نمونه
154123

mazoolagh
پنج شنبه 05 آبان 1401, 12:34 عصر
البته این روش هم که در بالا آمد گرچه خطای خیلی کمی داره اما باز هم راه درستی نیست و بنوعی اختراع دوباره چرخ هست.
راه درست و قطعی رو هم خواهم گذاشت (در پست 11 اشاره کردم)

ROSTAM2
یک شنبه 04 دی 1401, 07:59 صبح
Imports System.Text.RegularExpressions
Public Class UsingRegEx
Const Blank As Char = ChrW(32)
Const pt1 As String = "--.*[^\r\n]" ' -- (Singleline Comment)
Const pt2 As String = "/\*((?:.|\s)*?)\*/" ' /**/ (Multiline Comment)
Const pt3 As String = "[N]?'((?:.|\s)*?)'" ' Single Quotes
Const pt4 As String = "\u0022((?:.|\s)*?)\u0022" ' Double Quotes
Const pt5 As String = "\[((?:.|\s)*?)\]" ' []
Const Pattern_Ignore = pt1 + "|" + pt2 + "|" + pt3 + "|" + pt4 + "|" + pt5


Private Sub Btn_Process_Click(sender As Object, e As EventArgs) Handles Btn_Process.Click
LB_Words.Items.Clear()
LB_Keywords.Items.Clear()
Dim strSQL As String = TB_Source.Text
Dim strMOD As String = strSQL
For Each m As Match In Regex.Matches(strMOD, Pattern_Ignore, RegexOptions.Multiline)
strMOD = strMOD.Remove(m.Index, m.Length)
strMOD = strMOD.Insert(m.Index, FillWhiteSpaces(m.Value))
Next
TB_Modified.Text = strMOD
'strMOD = Regex.Replace(strSQL, pattern, String.Empty)
Dim x As List(Of Char) = "(),;!=<>+-*/%^|&~".ToList
For Each c In x
strMOD = strMOD.Replace(c, Blank + c + Blank)
Next
strMOD = Regex.Replace(strMOD, "\s", Blank)
strMOD = Regex.Replace(strMOD, "[ ]{2,}", Blank)
Dim Words As List(Of String) = strMOD.Trim.Split(Blank).ToList
For Each word In Words
If Regex.IsMatch(word, "^[a-zA-Z_@]+$") Then
LB_Words.Items.Add(word)
If SQL_KeyWords.Contains(word.ToUpper) Then
LB_Keywords.Items.Add(word)
End If
End If
Next
End Sub

Function FillWhiteSpaces(str As String) As String
Return Regex.Replace(NZ(str), "\s", ChrW(&HFFFD))
End Function

Private Function NZ(str As String) As String
If String.IsNullOrEmpty(str) Then
Return String.Empty
Else
Return str
End If
End Function
End Class
سلام مجدد.
برای شناسایی Attribute ها برای سورس کد #C مخصوصا اونایی که مقدار رشته ای دارن و بینشون ممکنه فاصله باشه یا بدون فاصله باشه Pattern همین درسته؟


Const pt5 As String = "\[((?:.|\s)*?)\]" ' []

mazoolagh
یک شنبه 04 دی 1401, 12:30 عصر
سلام مجدد.
برای شناسایی Attribute ها برای سورس کد #C مخصوصا اونایی که مقدار رشته ای دارن و بینشون ممکنه فاصله باشه یا بدون فاصله باشه Pattern همین درسته؟


Const pt5 As String = "\[((?:.|\s)*?)\]" ' []


سلام دوباره و روز خوش
من این پترن رو برای همین مسئله نوشتم و اگر عبارت بین [] ساده باشه باید جواب بده،
ولی بهتره همه حالتها رو تست کنین (چون خودم ممکنه مواردی در مورد اینها باشه که ندونم)،
و اگر مشکلی بود همینجا مطرح کنین تا پترن مناسب رو بنویسم.

mazoolagh
یک شنبه 04 دی 1401, 12:35 عصر
البته این روش هم که در بالا آمد گرچه خطای خیلی کمی داره اما باز هم راه درستی نیست و بنوعی اختراع دوباره چرخ هست.
راه درست و قطعی رو هم خواهم گذاشت (در پست 11 اشاره کردم)

خوب شد تاپیک بالا اومد.
من این رو همون وقت آماده کرده بودم ولی یادم رفت!
چند شات باید آماده کنم بعد همینجا میذارم.

ROSTAM2
یک شنبه 04 دی 1401, 18:45 عصر
سلام دوباره و روز خوش
من این پترن رو برای همین مسئله نوشتم و اگر عبارت بین [] ساده باشه باید جواب بده،
ولی بهتره همه حالتها رو تست کنین (چون خودم ممکنه مواردی در مورد اینها باشه که ندونم)،
و اگر مشکلی بود همینجا مطرح کنین تا پترن مناسب رو بنویسم.

فکر کنم درست باشه این لیست یافته ها از این کد هست:

154397
154396

mazoolagh
دوشنبه 05 دی 1401, 11:06 صبح
خوب شد تاپیک بالا اومد.
من این رو همون وقت آماده کرده بودم ولی یادم رفت!
چند شات باید آماده کنم بعد همینجا میذارم.

آموزش: تفسیر و آنالیز سورس SQL با استفاده از Microsoft.SqlServer.TransactSql.ScriptDom (barnamenevis.org) (https://barnamenevis.org/showthread.php?572300-%D8%AA%D9%81%D8%B3%DB%8C%D8%B1-%D9%88-%D8%A2%D9%86%D8%A7%D9%84%DB%8C%D8%B2-%D8%B3%D9%88%D8%B1%D8%B3-SQL-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-Microsoft-SqlServer-TransactSql-ScriptDom&p=2455153#post2455153)

Hossis
یک شنبه 18 دی 1401, 22:55 عصر
با سلام.

من یکسری کلمات کلیدی رو به آرایه دادم و روش من برای تشخیص وجود اون کلمه کلیدی در متن اصلی استفاده از حلقه بوده آیا روش ساده تری هم وجود داره البته من از طریق LINQ نتونستم با آرایه به نتیجه برسم.


Function ISKeyWord(ByRef Value As String) As Boolean
Dim KeyWords() = {"FROM", "AS", "WHERE", "IS", "SELECT", "ALL"}
For Each Word As String In KeyWords
If Value.ToUpper.CompareTo(Word) = 0 Then
Value = Word
Return True
End If
Next
Return False
End Function



روش دوم استفاده از فیلتر بود به اینصورت که اصولی نیست:


Function ISKeyWord(ByRef Value As String) As Boolean
Dim KeyWords() = {"FROM", "AS", "WHERE", "IS", "SELECT", "ALL"}
Dim Expr() As String = Filter(KeyWords, Value.ToUpper, True, CompareMethod.Binary)
If Expr.Length > 0 Then
Value = Expr(0)
Return True
End If
Return False
End Function

بزار خیالت رو راحت کنم
اگر می خوای کلمات کلیدی رو با رنگ متمایز نشون بدی، از کامپوننت fastcoloredtextbox استفاده کن، راحته و سریع و زیبا و البته متن باز
البته من قبلا از همین روش استفاده می کردم و با عبارت با قاعده، کلمات کلیدی و ... رو رنگی می کردم ولی سرعت رو می آورد پایین.