نمایش نتایج 1 تا 26 از 26

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

  1. #1
    کاربر دائمی آواتار ROSTAM2
    تاریخ عضویت
    اسفند 1390
    محل زندگی
    فارس
    پست
    1,639

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

    با سلام.

    من یکسری کلمات کلیدی رو به آرایه دادم و روش من برای تشخیص وجود اون کلمه کلیدی در متن اصلی استفاده از حلقه بوده آیا روش ساده تری هم وجود داره البته من از طریق 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
    آخرین ویرایش به وسیله ROSTAM2 : پنج شنبه 21 مهر 1401 در 09:49 صبح

  2. #2
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

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

    سلام و روز خوش
    اگر آرایه رو به لیست تبدیل کنین (با متد tolist) بعد میتونین با contains چک کنین.

  3. #3
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

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

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

  4. #4
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

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

    یادم نبود؛
    بجای این که کلمات رو در آرایه بریزین و بعد به لیست تبدیل کنین،مستقیما هم میتونین لیست رو 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

  5. #5
    کاربر دائمی آواتار ROSTAM2
    تاریخ عضویت
    اسفند 1390
    محل زندگی
    فارس
    پست
    1,639

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

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

    ممنون.
    آخرین ویرایش به وسیله ROSTAM2 : پنج شنبه 21 مهر 1401 در 11:38 صبح

  6. #6
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

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

    بله، چون 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) نیست.

    Screenshot 2022-10-13 125426.png

  7. #7
    کاربر دائمی آواتار ROSTAM2
    تاریخ عضویت
    اسفند 1390
    محل زندگی
    فارس
    پست
    1,639

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

    برای اینکه موضوع روشن بشه بیشتر توضیح می دم:

    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 بود قبول نمی کرد. و بنظر همون دستور اول بهتر بود:

    Untitled.jpg
    آخرین ویرایش به وسیله ROSTAM2 : پنج شنبه 21 مهر 1401 در 18:15 عصر

  8. #8
    کاربر دائمی آواتار ROSTAM2
    تاریخ عضویت
    اسفند 1390
    محل زندگی
    فارس
    پست
    1,639

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

    آخرین تغییرات در 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



  9. #9
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

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

    بسیار عالی!

    در کد تابع 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---")


    Screenshot 2022-10-15 104054.png

  10. #10
    کاربر دائمی
    تاریخ عضویت
    خرداد 1391
    محل زندگی
    ایران
    پست
    372

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

    سلام
    با استفاده از ریجکس می توان تمام حروف و کلمات موجود در متن مورد نظر را تبدیل به یک لیست نمود.

    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()

  11. #11
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

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

    نقل قول نوشته شده توسط 336699 مشاهده تاپیک
    سلام
    با استفاده از ریجکس می توان تمام حروف و کلمات موجود در متن مورد نظر را تبدیل به یک لیست نمود.

    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 باید باشه.

  12. #12
    کاربر دائمی
    تاریخ عضویت
    خرداد 1391
    محل زندگی
    ایران
    پست
    372

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

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

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

  13. #13
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

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

    خب میدونیم که برای این مسئله از قبل پاسخ داریم که در همین محیط QUERY EDITOR برنامه MSSQLMS (و مشابه اون) پیاده شده.
    چیزی که هست اینه که پاسخ مد نظر آقای ROSTAM2 پیچیده تر از یک split یا regex ساده است.

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

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

  14. #14
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    How to use RegEx to find SQL Keywords in a string

    در ادامه بحث و این که چجوری باید از 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)*?)\]" ' []

  15. #15
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    How to use RegEx to find SQL Keywords in a string

    در مرحله بعد هر چه 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

  16. #16
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    How to use RegEx to find SQL Keywords in a string

    در گام بعدی در چپ و راست کارآکترهایی مثل () و اپراتورها (مثل = * / + و ...) یک 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:57 صبح

  17. #17
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    How to use RegEx to find SQL Keywords in a string

    تازه الان هست که میتونیم کد رو 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:59 صبح

  18. #18
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    How to use RegEx to find SQL Keywords in a string

    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

  19. #19
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    How to use RegEx to find SQL Keywords in a string

    نمونه
    regex.jpg

  20. #20
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

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

    البته این روش هم که در بالا آمد گرچه خطای خیلی کمی داره اما باز هم راه درستی نیست و بنوعی اختراع دوباره چرخ هست.
    راه درست و قطعی رو هم خواهم گذاشت (در پست 11 اشاره کردم)

  21. #21
    کاربر دائمی آواتار ROSTAM2
    تاریخ عضویت
    اسفند 1390
    محل زندگی
    فارس
    پست
    1,639

    نقل قول: How to use RegEx to find SQL Keywords in a string

    نقل قول نوشته شده توسط mazoolagh مشاهده تاپیک
    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)*?)\]" ' []

  22. #22
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: How to use RegEx to find SQL Keywords in a string

    نقل قول نوشته شده توسط ROSTAM2 مشاهده تاپیک
    سلام مجدد.
    برای شناسایی Attribute ها برای سورس کد #C مخصوصا اونایی که مقدار رشته ای دارن و بینشون ممکنه فاصله باشه یا بدون فاصله باشه Pattern همین درسته؟


    Const pt5 As String = "\[((?:.|\s)*?)\]" ' []
    سلام دوباره و روز خوش
    من این پترن رو برای همین مسئله نوشتم و اگر عبارت بین [] ساده باشه باید جواب بده،
    ولی بهتره همه حالتها رو تست کنین (چون خودم ممکنه مواردی در مورد اینها باشه که ندونم)،
    و اگر مشکلی بود همینجا مطرح کنین تا پترن مناسب رو بنویسم.

  23. #23
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

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

    نقل قول نوشته شده توسط mazoolagh مشاهده تاپیک
    البته این روش هم که در بالا آمد گرچه خطای خیلی کمی داره اما باز هم راه درستی نیست و بنوعی اختراع دوباره چرخ هست.
    راه درست و قطعی رو هم خواهم گذاشت (در پست 11 اشاره کردم)
    خوب شد تاپیک بالا اومد.
    من این رو همون وقت آماده کرده بودم ولی یادم رفت!
    چند شات باید آماده کنم بعد همینجا میذارم.

  24. #24
    کاربر دائمی آواتار ROSTAM2
    تاریخ عضویت
    اسفند 1390
    محل زندگی
    فارس
    پست
    1,639

    نقل قول: How to use RegEx to find SQL Keywords in a string

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

  25. #25
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

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

    نقل قول نوشته شده توسط mazoolagh مشاهده تاپیک
    خوب شد تاپیک بالا اومد.
    من این رو همون وقت آماده کرده بودم ولی یادم رفت!
    چند شات باید آماده کنم بعد همینجا میذارم.
    آموزش: تفسیر و آنالیز سورس SQL با استفاده از Microsoft.SqlServer.TransactSql.ScriptDom (barnamenevis.org)

  26. #26
    کاربر دائمی آواتار Hossis
    تاریخ عضویت
    آبان 1386
    محل زندگی
    بیرجند
    پست
    1,731

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

    نقل قول نوشته شده توسط ROSTAM2 مشاهده تاپیک
    با سلام.

    من یکسری کلمات کلیدی رو به آرایه دادم و روش من برای تشخیص وجود اون کلمه کلیدی در متن اصلی استفاده از حلقه بوده آیا روش ساده تری هم وجود داره البته من از طریق 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 استفاده کن، راحته و سریع و زیبا و البته متن باز
    البته من قبلا از همین روش استفاده می کردم و با عبارت با قاعده، کلمات کلیدی و ... رو رنگی می کردم ولی سرعت رو می آورد پایین.

تاپیک های مشابه

  1. طریقه تشخیص اولین رکورد در دیتا لیست
    نوشته شده توسط sg.programmer در بخش ASP.NET Web Forms
    پاسخ: 3
    آخرین پست: چهارشنبه 08 آبان 1398, 10:35 صبح
  2. تشخیص یک کلمه در لیست
    نوشته شده توسط xrezax در بخش برنامه نویسی در 6 VB
    پاسخ: 5
    آخرین پست: شنبه 07 مرداد 1396, 14:04 عصر
  3. تشخیص وجود یک کلمه در یک جمله در لیست باکس
    نوشته شده توسط xrezax در بخش برنامه نویسی در 6 VB
    پاسخ: 1
    آخرین پست: چهارشنبه 28 تیر 1396, 03:16 صبح
  4. تشخیص به پایان رسیدن لیست باکس
    نوشته شده توسط xrezax در بخش برنامه نویسی در 6 VB
    پاسخ: 8
    آخرین پست: پنج شنبه 15 تیر 1391, 21:30 عصر
  5. اگر فایل موجود باشد چطور می بایست تشخیص داد
    نوشته شده توسط mahdy.asia در بخش ASP.NET Web Forms
    پاسخ: 2
    آخرین پست: دوشنبه 11 بهمن 1389, 02:29 صبح

برچسب های این تاپیک

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •