View Full Version : تشخیص فیلدی که داده های آن از چندین space تشکیل شده
moustafa
شنبه 28 مهر 1403, 08:01 صبح
با سلام
یه فیلدی از نوع رشته داریم که با چندین کاراکتر spaceپر شده بدیهی است که چون طول رشته داره empty و null نیست راه تشخیص اینطور فیلدها چیه ؟
eb_1345
شنبه 28 مهر 1403, 11:19 صبح
با سلام
یه فیلدی از نوع رشته داریم که با چندین کاراکتر spaceپر شده بدیهی است که چون طول رشته داره empty و null نیست راه تشخیص اینطور فیلدها چیه ؟
سلام
وقت بخیر!
احساس میکنم این سوال یجورائی به موضوع تاپیک خطا در ایجاد کاربرگ جدید در اکسل توسط اکسس (https://barnamenevis.org/showthread.php?589840-%D8%AE%D8%B7%D8%A7-%D8%AF%D8%B1-%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%DA%AF-%D8%AC%D8%AF%DB%8C%D8%AF-%D8%AF%D8%B1-%D8%A7%DA%A9%D8%B3%D9%84-%D8%AA%D9%88%D8%B3%D8%B7-%D8%A7%DA%A9%D8%B3%D8%B3) ارتباط داره :لبخند:
اگه همینطوره میتونی در حلقه کنترل فیلدها شرط زیر رو بکار ببری:
If Not IsNull(fld) And fld.Value Like "[ ]*" Then
fld = Replace(fld, " ", "*")
End If
توضیح شرط هم واضحه دیگه . شرط شده که اگه در بین فیلدها فیلدی هست که خالی نباشه و با کارکتر خالی شروع شده باشه بجای کارکتر خالی علامت ستاره جایگزین بشه
شما میتونی بجای این شرط ، شرط مورد نظر خودتو وارد کنی
eb_1345
شنبه 28 مهر 1403, 11:53 صبح
یا مثلاً برای حذف اسپیس :
If Not IsNull(fld) And fld.Value Like "[ ]*" Then
fld = Replace(fld, " ", "")
End If
moustafa
شنبه 28 مهر 1403, 13:03 عصر
سلام
وقت بخیر!
احساس میکنم این سوال یجورائی به موضوع تاپیک خطا در ایجاد کاربرگ جدید در اکسل توسط اکسس (https://barnamenevis.org/showthread.php?589840-%D8%AE%D8%B7%D8%A7-%D8%AF%D8%B1-%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%DA%AF-%D8%AC%D8%AF%DB%8C%D8%AF-%D8%AF%D8%B1-%D8%A7%DA%A9%D8%B3%D9%84-%D8%AA%D9%88%D8%B3%D8%B7-%D8%A7%DA%A9%D8%B3%D8%B3) ارتباط داره :لبخند:
اگه همینطوره میتونی در حلقه کنترل فیلدها شرط زیر رو بکار ببری:
If Not IsNull(fld) And fld.Value Like "[ ]*" Then
fld = Replace(fld, " ", "*")
End If
توضیح شرط هم واضحه دیگه . شرط شده که اگه در بین فیلدها فیلدی هست که خالی نباشه و با کارکتر خالی شروع شده باشه بجای کارکتر خالی علامت ستاره جایگزین بشه
شما میتونی بجای این شرط ، شرط مورد نظر خودتو وارد کنی
عرض ادب و احترام جناب بهرامی
بله . هم از سر کنجکاوی و هم از اینکه فرمودین موضوع رو قاطی نکنم تاپیک جدید زدم
دستتون درد نکنه که اینقدر کار راه اندازین .
mazoolagh
شنبه 28 مهر 1403, 13:09 عصر
سلام و روز خوش
در حالت خاص (فقط space) رو که جناب بهرامی در پست 2 پاسخ دادن.
در حالت عمومی باید white space چک بشه : یعنیSPACE , TAB , LINE FEED , FORM FEED , CARRIAGE RETURN
به این صورت که آیا در string مورد نظر کاراکتری جز اینها هست یا نه؟
اگر هست که این string از نظر ما empty نیست (در این مساله)،
وگرنه همه اش white space هست و از نظر ما empty حساب میشه (در این مساله).
With New regexp
.Pattern = "\S"
.Global = True
.Multiline = True
Debug.Print .Test(" a b c ")
Debug.Print .Test("abc" + vbTab + "d")
Debug.Print .Test("abc" + vbCrLf + "d")
Debug.Print .Test(vbNull)
Debug.Print .Test(" ")
Debug.Print .Test("")
Debug.Print .Test(vbTab)
Debug.Print .Test(vbCr)
Debug.Print .Test(vbLf)
Debug.Print .Test(vbCrLf)
Debug.Print .Test(vbFormFeed)
Debug.Print .Test(vbVerticalTab)
End With
خروجی:
True
True
True
True
False
False
False
False
False
False
False
False
moustafa
شنبه 28 مهر 1403, 23:15 عصر
سلام و روز خوش
در حالت خاص (فقط space) رو که جناب بهرامی در پست 2 پاسخ دادن.
در حالت عمومی باید white space چک بشه : یعنیSPACE , TAB , LINE FEED , FORM FEED , CARRIAGE RETURN
به این صورت که آیا در string مورد نظر کاراکتری جز اینها هست یا نه؟
اگر هست که این string از نظر ما empty نیست (در این مساله)،
وگرنه همه اش white space هست و از نظر ما empty حساب میشه (در این مساله).
With New regexp
.Pattern = "\S"
.Global = True
.Multiline = True
Debug.Print .Test(" a b c ")
Debug.Print .Test("abc" + vbTab + "d")
Debug.Print .Test("abc" + vbCrLf + "d")
Debug.Print .Test(vbNull)
Debug.Print .Test(" ")
Debug.Print .Test("")
Debug.Print .Test(vbTab)
Debug.Print .Test(vbCr)
Debug.Print .Test(vbLf)
Debug.Print .Test(vbCrLf)
Debug.Print .Test(vbFormFeed)
Debug.Print .Test(vbVerticalTab)
End With
خروجی:
True
True
True
True
False
False
False
False
False
False
False
False
عرض سلام وادب خدمت استاد گرانقدر
فرق empty و null در چیه ؟
ممکنه اینا رو برای یک تکست باکس در قالب شرط if بنویسید
نوع دیتا تایپ یک فیلد رو در رکوردست چگونه بررسی کنیم که استرینگ ء یا نامبر و چگونه بهم تبدیل کنیم ؟در جدولی که حاوی اطلاعات هستش این نوع تبدیل امکان پذیر هست ؟
if field1.type=number or string....
moustafa
شنبه 28 مهر 1403, 23:21 عصر
[
If Not IsNull(fld) And fld.Value Like "[ ]*" Then
fld = Replace(fld, " ", "*")
End If
جناب بهرامی این کد شامل داد های که اولش با اسپیلس و بعش با کاراکترهای دیگه ای که وارد شده هم میشه در حالیکه ما میخوایم مختص اسپیس باشه
eb_1345
یک شنبه 29 مهر 1403, 07:27 صبح
[
If Not IsNull(fld) And fld.Value Like "[ ]*" Then
fld = Replace(fld, " ", "*")
End If
جناب بهرامی این کد شامل داد های که اولش با اسپیلس و بعش با کاراکترهای دیگه ای که وارد شده هم میشه در حالیکه ما میخوایم مختص اسپیس باشه
تعداد اسپیس ها ثابته یا متغیر ؟
moustafa
یک شنبه 29 مهر 1403, 08:11 صبح
تعداد اسپیس ها ثابته یا متغیر ؟
بحث اینجاست که نمیدونیم اطلاعات رو بهمون میدن حالا چه جوری وارد کردن ،چه جوری خروجی گرفتن و....برای همین باید نوع دیتا تایپها و وایت اسپیسها کنترل و بررسی بشه
eb_1345
یک شنبه 29 مهر 1403, 12:47 عصر
بحث اینجاست که نمیدونیم اطلاعات رو بهمون میدن حالا چه جوری وارد کردن ،چه جوری خروجی گرفتن و....برای همین باید نوع دیتا تایپها و وایت اسپیسها کنترل و بررسی بشه
پس با این وجود بیائیم کار رو با یک نمونه ادامه بدیم
در فایل نمونه یک جدول قرار داره که دارای دو فیلد از نوع رشته می باشه . یک فرم هم وجود دارد که بر روی فرم دو کمند باتن . در رویداد کمند باتن اول به هر دو فیلد تعداد 10 اسپیس اضافه میشه ؛ منتها در فیلد اول هیچ کارکتر دیگه ای غیر از اسپیس اضافه نمیشه ولی در فیلد دوم بعد از 10 اسپیس یک علامت اسلش و سه حرف xxx اضافه میشه
حالا بر روی کمند باتن دوم در حلقه شرط گذاشته ایم که اگه در بین فیلدها فیلدی وجود داشت که طول اون بیشتر از صفر بود و ارزش یا مقدار فیلد مساوی اسپیس به اندازه طول فیلد بود بیاد بجای تعداد اسپیس ها علامت ستاره جایگزین کنه
فعلا فقط با همین اندازه توضیح فایل نمونه رو بررسی و امتحان کن تا در ادامه اگه سوال یا ابهام دیگه ای بود ان شاءالله بتونیم برطرف کنیم
کدهای فایل نمونه :
Private Sub Command24_Click()
Dim rs As DAO.Recordset
Dim fld As DAO.Field
Set rs = CurrentDb.OpenRecordset("Table1")
Do While Not rs.EOF
rs.Edit
For Each fld In rs.Fields
If Len(fld) > 0 And fld.Value = Space(Len(fld)) Then
fld = Replace(fld, " ", "*")
End If
Next
rs.Update
rs.MoveNext
Loop
rs.Close
End Sub
Private Sub Command29_Click()
DoCmd.RunSQL "DELETE * FROM Table1"
DoCmd.RunSQL "INSERT INTO Table1 (Fspace1,Fspace2)VALUES ('" & Space(10) & "','" & Space(10) & "/xxx" & "')"
End Sub
mazoolagh
یک شنبه 29 مهر 1403, 13:11 عصر
عرض سلام وادب
فرق empty و null در چیه ؟
نوع دیتا تایپ یک فیلد رو در رکوردست چگونه بررسی کنیم که استرینگ ء یا نامبر و چگونه بهم تبدیل کنیم ؟در جدولی که حاوی اطلاعات هستش این نوع تبدیل امکان پذیر هست ؟
با سلام و احترام
empty منظور یک string تهی هست (0 کاراکتر) یعنی ""
null مقداری هست که فقط برای متغیر نوع variant معنی داره (پس یک متغییر از نوع string یا integer نمیتونه null باشه)
ولی در دیتابیس یک فیلد از نوع text یا integer میتونه null باشه،
و با تابع isnull میتونین این رو بررسی کنین - یا با تابع len چک کنین چون برای null مقدار null برمیگردونه (نه 0).
که قطعا همون isnull بهتره.
moustafa
یک شنبه 29 مهر 1403, 13:48 عصر
با سلام و احترام
empty منظور یک string تهی هست (0 کاراکتر) یعنی ""
null مقداری هست که فقط برای متغیر نوع variant معنی داره (پس یک متغییر از نوع string یا integer نمیتونه null باشه)
ولی در دیتابیس یک فیلد از نوع text یا integer میتونه null باشه،
و با تابع isnull میتونین این رو بررسی کنین - یا با تابع len چک کنین چون برای null مقدار null برمیگردونه (نه 0).
که قطعا همون isnull بهتره.
تشکر استاد ای کاش بقیه سوالات رو هم عنایت میکردین جواب میدادین
eb_1345
یک شنبه 29 مهر 1403, 14:18 عصر
نوع دیتا تایپ یک فیلد رو در رکوردست چگونه بررسی کنیم که استرینگ ء یا نامبر و چگونه بهم تبدیل کنیم ؟در جدولی که حاوی اطلاعات هستش این نوع تبدیل امکان پذیر هست ؟
نمایش نام و نوع فیلد:
Dim tdf As TableDef
Dim Fld As Field
Dim dbs As DAO.Database
Set dbs = CurrentDb
Set tdf = dbs.TableDefs("Table1")
For Each Fld In tdf.Fields
MsgBox " FieldName :" & Fld.Name & " FieldType: " & Fld.Type
Next Fld
Set Fld = Nothing
Set tdf = Nothing
تغییر دیتاتایپ فیلد:
CurrentDb.Execute "ALTER TABLE Table1 ALTER COLUMN Fspace1 Integer"
CurrentDb.Execute "ALTER TABLE Table1 ALTER COLUMN Fspace2 TEXT(40)"
eb_1345
یک شنبه 29 مهر 1403, 14:31 عصر
اگه فقط میخواهی بصورت مورد نوع دیتا تایپ فیلدی رو بدست بیاری از نمونه کد زیر استفاده کن!
نوع دیتا بصورت عدد نمایش داده میشه .مثلاً عدد 4 یعنی نوع دیتا عدده و 10 یعنی تکست
MsgBox CurrentDb.TableDefs("Table1").Fields("Id").Type
moustafa
یک شنبه 29 مهر 1403, 16:32 عصر
ا استاد و سرور گرامی جناب بهرامی عزیز از لطف و توجه شما بسیار ممنوم
moustafa
یک شنبه 29 مهر 1403, 16:57 عصر
جناب بهرامی شما چقدر به من ایده میدین به تبعیت از کد شما یه فانکشن نوشتم
Public Function detectSpace(strname As String) As Boolean
Dim i As Integer
If Len(strname) = 0 Then
detectSpace = False
Else
For i = 1 To Len(strname)
If Asc(Mid(strname, i, i + 1)) = 32 Then
Else
detectSpace = False
Exit Function
End If
Next i
detectSpace = True
End If
End Function
eb_1345
یک شنبه 29 مهر 1403, 21:16 عصر
جناب بهرامی شما چقدر به من ایده میدین به تبعیت از کد شما یه فانکشن نوشتم
Public Function detectSpace(strname As String) As Boolean
Dim i As Integer
If Len(strname) = 0 Then
detectSpace = False
Else
For i = 1 To Len(strname)
If Asc(Mid(strname, i, i + 1)) = 32 Then
Else
detectSpace = False
Exit Function
End If
Next i
detectSpace = True
End If
End Function
سلام
وقت بخیر!
احسنت!:تشویق::تشویق::تشویق::ت شویق:
بجای عدد 32 میشه از (" ")Asc هم استفاده کرد
eb_1345
یک شنبه 29 مهر 1403, 21:21 عصر
................
mazoolagh
یک شنبه 29 مهر 1403, 21:43 عصر
جناب بهرامی شما چقدر به من ایده میدین به تبعیت از کد شما یه فانکشن نوشتم
Public Function detectSpace(strname As String) As Boolean
Dim i As Integer
If Len(strname) = 0 Then
detectSpace = False
Else
For i = 1 To Len(strname)
If Asc(Mid(strname, i, i + 1)) = 32 Then
Else
detectSpace = False
Exit Function
End If
Next i
detectSpace = True
End If
End Function
تابع instr همین کار رو نمیکنه؟!
mazoolagh
یک شنبه 29 مهر 1403, 21:51 عصر
تشکر ای کاش بقیه سوالات رو هم عنایت میکردین جواب میدادین
خواهش میکنم
ولی چیزی نمونده بنظرم.
اگر منظورتون اون موردی هست که جناب آقای بهرامی در پست 14 اشاره کردن مفصل در تاپیک زیر بحث شده:
لیست همه جدولها / کوئریها و فیلدهای آنها List of All Tables/Queries and their Fields (https://barnamenevis.org/showthread.php?577500)
moustafa
دوشنبه 30 مهر 1403, 07:42 صبح
سلام
وقت بخیر!
احسنت!:تشویق::تشویق::تشویق::ت شویق:
بجای عدد 32 میشه از (" ")Asc هم استفاده کرد
دورد بر شما جناب بهرامی
بسیار سپاسگذارم که هم کارمون راه انداختین و هم ذهن فرسوده مون رفرش فرمودین
moustafa
دوشنبه 30 مهر 1403, 07:53 صبح
تابع instr همین کار رو نمیکنه؟!
سلام واحترام سرورگرامی
از این تابع من تو برنامه استفاده کردم الان بکلی از ذهنم پرکشیده که برای چی بکار بردم
UPDATE info SET info.ax = [currentproject].[path] & Right([ax],Len([ax])-InStr(1,[ax],"\pic")+1);
moustafa
دوشنبه 30 مهر 1403, 08:07 صبح
تابع instr همین کار رو نمیکنه؟!
تابع instr نقطه شروع یک رشته رو داخل یک رشته برمیگردونه در این تابع میخوایم بررسی کنیم که رشته یا فیلد یا تکست باکس white space (مشتکل فقط از اسپیس ) هست یا نه
mazoolagh
دوشنبه 30 مهر 1403, 10:27 صبح
تابع instr نقطه شروع یک رشته رو داخل یک رشته برمیگردونه در این تابع میخوایم بررسی کنیم که رشته یا فیلد یا تکست باکس white space (مشتکل فقط از اسپیس ) هست یا نه
if instr(str," ")>0 then
...
endif
یا اگه اصرار دارین یه تابع جداگانه داشته باشین (پست شماره 16):
Public Function detectSpace(strname As String) As Boolean
detectSpace = (instr(strname," ")>0)
End Function
================
آپدیت:
منظور شما رو اشتباه گرفته بودم - ولی پست رو میذارم همینجور بمونه.
حتی اگر هم نخواین از روش پست 5 استفاده کنین (که قابلیت انعطاف بیشتری هم داره)
باز هم نیازی به لوپ نیست:
Public Function detectSpace(strname As String) As Boolean
detectSpace=(strname<>"" AND strname=STRING(LEN(strname)," "))
End Function
moustafa
دوشنبه 30 مهر 1403, 13:39 عصر
if instr(str," ")>0 then
...
endif
یا اگه اصرار دارین یه تابع جداگانه داشته باشین (پست شماره 16):
Public Function detectSpace(strname As String) As Boolean
detectSpace = (instr(strname," ")>0)
End Function
================
آپدیت:
منظور شما رو اشتباه گرفته بودم - ولی پست رو میذارم همینجور بمونه.
حتی اگر هم نخواین از روش پست 5 استفاده کنین (که قابلیت انعطاف بیشتری هم داره)
باز هم نیازی به لوپ نیست:
Public Function detectSpace(strname As String) As Boolean
detectSpace=(strname<>"" AND strname=STRING(LEN(strname)," "))
End Function
دستتون درد نکنه استاد پست پنج رو هم عرض کرده بودم برامون با if و بررسی تمام موارد در یک فیلد یا تکس بنویسین بعنوان یه فانکشن عمومی در برنامه هامون استفاده کنیم
eb_1345
دوشنبه 30 مهر 1403, 21:22 عصر
دستتون درد نکنه استاد پست پنج رو هم عرض کرده بودم برامون با if و بررسی تمام موارد در یک فیلد یا تکس بنویسین بعنوان یه فانکشن عمومی در برنامه هامون استفاده کنیم
حالا ان شاءالله تا بعداً استاد در صورت تمایل خواستن یک فانکشن عمومی تهیه کنن عنایت داشته باش که برای استفاده از کتابخانه RegExp در قسمت رفرنس ها مطابق تصویر ضمیمه تیک آیتمی که با فلش مشخص کرده ام بزنی!
Dim rex As RegExp
Set rex = New RegExp
With rex
.Pattern = "\S"
.Global = True
.MultiLine = True
MsgBox .Test(" a b c ")
MsgBox .Test("abc" + vbTab + "d")
MsgBox .Test("abc" + vbCrLf + "d")
MsgBox .Test(vbNull)
MsgBox .Test(" ")
MsgBox .Test("")
MsgBox .Test(vbTab)
MsgBox .Test(vbCr)
MsgBox .Test(vbLf)
MsgBox .Test(vbCrLf)
MsgBox .Test(vbFormFeed)
MsgBox .Test(vbVerticalTab)
End With
eb_1345
دوشنبه 30 مهر 1403, 23:48 عصر
البته میشه بدون تیک زدن اون در قسمت رفرنس ها در ابتدای کد ها اون رو بصورت زیر معرفی کنی :
Dim objRegExp
Set objRegExp = CreateObject("VBScript.RegExp")
Dim objRegExp
Set objRegExp = CreateObject("VBScript.RegExp")
With objRegExp
.........
End With
بنظرم برای استفاده از RegEx یا (Regular Expressions) بمنظور انجام عملیات تطابق و جایگذاری عبارات در رشته ها بواسطه قواعد خاص و استفاده از نمادها و دستورات مخصوصی که در اون وجود داره نیاز به یک آموزش در یک تاپیک مستقل داره
moustafa
سه شنبه 01 آبان 1403, 01:48 صبح
تشکر جناب بهرامی
زحمت فانکشن هم کشیده بشه خیلی عالی میشه
public function detectWhiteSpace(strname as string) as boolean
.....
end function
eb_1345
سه شنبه 01 آبان 1403, 05:34 صبح
جناب بهرامی شما چقدر به من ایده میدین به تبعیت از کد شما یه فانکشن نوشتم
Public Function detectSpace(strname As String) As Boolean
Dim i As Integer
If Len(strname) = 0 Then
detectSpace = False
Else
For i = 1 To Len(strname)
If Asc(Mid(strname, i, i + 1)) = 32 Then
Else
detectSpace = False
Exit Function
End If
Next i
detectSpace = True
End If
End Function
Public Function detectSpace(strname As String) As Boolean
detectSpace=(strname<>"" AND strname=STRING(LEN(strname)," "))
End Function
تشکر جناب بهرامی
زحمت فانکشن هم کشیده بشه خیلی عالی میشه
با دو فانکشن پست 16 که خودت ایجاد کردی و پست 24 که جناب مازولاق پیشنهاد دادن به جواب میرسی ، دیگه نیاز به فانکشن خاص دیگه نداری!
به نظر من فانکشن پست 24 که جناب مازولاق پیشنهاد دادن خیلی بهتره ،چون بدون استفاده از لوپ یا حلقه و فقط با یک خط کد راحت به جواب میرسی
زیاد سخت نگیر آقا مصطفی !
moustafa
سه شنبه 01 آبان 1403, 10:29 صبح
با دو فانکشن پست 16 که خودت ایجاد کردی و پست 24 که جناب مازولاق پیشنهاد دادن به جواب میرسی ، دیگه نیاز به فانکشن خاص دیگه نداری!
به نظر من فانکشن پست 24 که جناب مازولاق پیشنهاد دادن خیلی بهتره ،چون بدون استفاده از لوپ یا حلقه و فقط با یک خط کد راحت به جواب میرسی
زیاد سخت نگیر آقا مصطفی !
بله چشم :خجالت:
mazoolagh
سه شنبه 01 آبان 1403, 10:36 صبح
حالا ان شاءالله تا بعداً مازو در صورت تمایل خواستن یک فانکشن عمومی تهیه کنن ...
سلام جناب بهرامی
راستش من هنوز نگرفتم تابع مورد نظر جناب مصطفی گرامی چی هست و قراره چه کار کنه؟
ممنون میشم روشنگری کنین.
mazoolagh
سه شنبه 01 آبان 1403, 10:53 صبح
بنظرم برای استفاده از RegEx یا (Regular Expressions) بمنظور انجام عملیات تطابق و جایگذاری عبارات در رشته ها بواسطه قواعد خاص و استفاده از نمادها و دستورات مخصوصی که در اون وجود داره نیاز به یک آموزش در یک تاپیک مستقل داره
خود ابجکت regexp ساده است و پراپرتی ها و متدهاش خیلی کم و سرراستن.
قسمت سختش نوشتن اون پترن هست که بدبختانه آموزش برنمیداره بس که گسترده است
و خیلی راحت میشه یک پترن بد نوشت که فشار به پردازنده بیاره یا کلا تو لوپ بیفته!
در تاپیک زیر (طبق معمول با عنوان نامناسب!) یک نمونه از کار با regexp برای validation فرم هست
https://barnamenevis.org/showthread.php?558147
mazoolagh
سه شنبه 01 آبان 1403, 11:01 صبح
دلیل این که در پست 24 برداشت اشتباه از کار تابع detectSpace داشتم همین اسمش بود!
detect این معنی رو تداعی میکنه که شما میخواین ببینین یک چیزی در بین چیزای دیگه هست یا نه (مثل یک کاراکتر در یک رشته)
که خب ما تابع instr رو داریم که همین کار رو میکنه.
اگر قرار باشه کلیت یک چیزی رو با یک چیز دیگه مقایسه کنیم اولش یک IS میذاریم: isnull, isnothing, isempty, isarray و ...
eb_1345
سه شنبه 01 آبان 1403, 13:26 عصر
با سلام
یه فیلدی از نوع رشته داریم که با چندین کاراکتر spaceپر شده بدیهی است که چون طول رشته داره empty و null نیست راه تشخیص اینطور فیلدها چیه ؟
سلام جناب بهرامی
راستش من هنوز نگرفتم تابع مورد نظر جناب مصطفی گرامی چی هست و قراره چه کار کنه؟
ممنون میشم روشنگری کنین.
با عرض سلام متقابل
ظاهراً ایشون در تابع مورد نظرشون میخوان تشخیص بدن که آیا محتویات یک ( رشته / تکست باکس/ فیلد جدول) که خالی نیست فقط و فقط از space تشکیل شده یا نه
و بنده هم با توجه به برداشتی که از خواسته و هدف ایشون در این تاپیک پیدا کردم در پست 29 متذکر شدم که توابع پست 16 و 24 خواسته ایشون رو تامین میکنه ، بخصوص تابع پست 24 جنابعالی
eb_1345
سه شنبه 01 آبان 1403, 13:45 عصر
خود ابجکت regexp ساده است و پراپرتی ها و متدهاش خیلی کم و سرراستن.
قسمت سختش نوشتن اون پترن هست که بدبختانه آموزش برنمیداره بس که گسترده است
و خیلی راحت میشه یک پترن بد نوشت که فشار به پردازنده بیاره یا کلا تو لوپ بیفته!
بله ، دقیقاً سختی استفاده از این آبجکت همون پترن هاشه که بقول شما اینقدر گسترده و متنوعه که آدم توش قاطی میکنه
eb_1345
سه شنبه 01 آبان 1403, 20:31 عصر
.................................
mazoolagh
چهارشنبه 02 آبان 1403, 19:15 عصر
با استفاده از regexp تابع زیر رو برای اعتبار سنجی یک رشته که فقط مشتمل بر فضای خالی باشه ایجاد کردم ؛ نمیدونم پترنشو درست نوشتم یا نه
مازولاق عزیز لطفاً در خصوص درست و یا غلط بودن تابع اظهار نظر بفرماین !
پترن برای کاری که مورد نظر هست درسته،
و توضیح هم گویاست.
با اجازه شما چند مورد تکمیلی رو عرض میکنم:
1- همونجور که توضیح داده شد، {1,} شرط تعداد رو مشخص میکنه که میشه یکی یا بیشتر.
معمولا {m,n} رو برای حالتهایی بکار میبریم که m , n به جز 1 باشن - برای یکی یا بیشتر نماد + رو داریم:
^\s+$
2- این پترن درست هست - ولی در مقایسه با پترن پست 5 (S\) ، احتمالا اورهد بیشتری داره:
اینجا حتما باید کل string تا آخر چک بشه برای s\ (همون white space) ،
ولی S\ یعنی هر کارآکتری که white space نیست - پس دست کم non-match رو زودتر برمیگردونه.
دوستانی که مطلب رو دنبال میکنن به تفاوت s\ و S\ دقت کنن!
3- در اینجا پترن مقید به اغاز و پایان string یا line شده،
که این رو در یک پست دیگه در ادامه همین تاپیک باز میکنم.
ضمناً از مازولاق خواهش میکنم در تاپیک استفاده از Regular Expressions یا به اخصار RegEx برای جستجو و جایگذاری عبارت در متن (https://barnamenevis.org/showthread.php?590028-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-Regular-Expressions-%DB%8C%D8%A7-%D8%A8%D9%87-%D8%A7%D8%AE%D8%B5%D8%A7%D8%B1-RegEx-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%AC%D8%B3%D8%AA%D8%AC%D9%88-%D9%88-%D8%AC%D8%A7%DB%8C%DA%AF%D8%B0%D8%A7%D8%B1%DB%8C-%D8%B9%D8%A8%D8%A7%D8%B1%D8%AA-%D8%AF%D8%B1-%D9%85%D8%AA%D9%86) که امروز ایجاد کردم حواسشون به بنده باشه ، چون در ارتباط با مقوله فوق خیلی اشراف ندارم و ممکنه در بیان مطالب و ارائه کدهای نمونه دچار اشتباه بشم
هرچند آب سر بالا نمیره،
ولی چشم!
تاپیک آموزشی به طور متعارف پست ها با استارتر هست،
دیگران مگر پرسش مرتبط با پستهای اصلی داشته باشن - وگرنه تاپیک از روال خارج میشه.
من هم اگر پرسشی یا نکته مبهمی بود، پس از جا افتادن تاپیک و رسیدن به جایی که طرح پرسش معنادار باشه مطرح میکنم.
eb_1345
چهارشنبه 02 آبان 1403, 19:41 عصر
سلام استاد!
با عرض شرمندگی قبل از اینکه شما پست شماره 36 رو ارسال کنی من کدها و مطالب پست قبلی خودم رو حذف کردم . چون احساس کردم با وجود مطالب پستهای قبلی دیگه نیازی به مطالب اون پست نیست که یدفعه متوجه پست شما شدم
mazoolagh
چهارشنبه 02 آبان 1403, 20:33 عصر
وقتی با ^ و $ پترن رو مقید به آغاز و پایان line (یا string) میکنیم باید حواسمون به multiline باشه،
و مشخصا این که هدف کل line و یا بخشی از اون هست نیز باید مشخص باشه.
فرض کنین که یک پترن ساده داریم که قرار هست دنبال ترکیب هایی مشابه 12:345 بگرده (دقیقا 2 رقم - یک : - دقیقا سه رقم)
Dim strs()
strs = Array( _
"111:22 222:33", _
"111:22 222:33 ", _
"111:22" + vbCrLf + "222:33", _
" 111:22" + vbCrLf + "222:33 ", _
"aaa" + vbCrLf + "a111:22" + vbCrLf + "222:33b" + vbCrLf + "ddd")
Dim i As Integer
Dim mc As MatchCollection
Dim m As Match
حالا برای هر کدوم از اینها تست و نتایج رو مقایسه کنین:
With New regexp
.Pattern = "\d{3}:\d{2}"
.Global = True
.Multiline = False
For i = LBound(strs) To UBound(strs)
Set mc = .Execute(strs(i))
For Each m In mc
Debug.Print m,
Next
Debug.Print
Next
End With
With New regexp
.Pattern = "^\d{3}:\d{2}$"
.Global = True
.Multiline = True
For i = LBound(strs) To UBound(strs)
Set mc = .Execute(strs(i))
For Each m In mc
Debug.Print m,
Next
Debug.Print
Next
End With
With New regexp
.Pattern = "^\d{3}:\d{2}$"
.Global = True
.Multiline = False
For i = LBound(strs) To UBound(strs)
Set mc = .Execute(strs(i))
For Each m In mc
Debug.Print m,
Next
Debug.Print
Next
End With
mazoolagh
چهارشنبه 02 آبان 1403, 20:36 عصر
سلام
با عرض شرمندگی قبل از اینکه شما پست شماره 36 رو ارسال کنی من کدها و مطالب پست قبلی خودم رو حذف کردم . چون احساس کردم با وجود مطالب پستهای قبلی دیگه نیازی به مطالب اون پست نیست که یدفعه متوجه پست شما شدم
سلام دوباره
پست خوبی بود اتفاقا،
و نکته مهمی رو نشون میداد.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.