PDA

View Full Version : تفکیک یک عبارت



SYSMAN
یک شنبه 16 مرداد 1384, 01:01 صبح
همه ی اساتید خسته نباشید
می خوام بدونم چطوری می شه این عبارت رو تجزیه کرد
[Color [A=255, R=100, G=200, B=50
به طوری که اعداد 255 و 100 و 50 از بقیه عبارت جدا و داخل یک آرایه یا متغییر قرار بگیرند.

یاشار
یک شنبه 16 مرداد 1384, 02:14 صبح
فکر می‌کنم منظورتون هر چهار عدد مربوط به رنگ بوده باشه :




Private Function ParsColor(ByVal s As String) As Int32()

Dim tmp(3) As Int32

Dim pattern As String = "^color\s*\["
pattern &= "\s*a\s*=\s*(?<Alpha>\d{1,3})\s*,"
pattern &= "\s*r\s*=\s*(?<Red>\d{1,3})\s*,"
pattern &= "\s*g\s*=\s*(?<Green>\d{1,3})\s*,"
pattern &= "\s*b\s*=\s*(?<Blue>\d{1,3})\s*"
pattern &= "\]$"

Dim Eng As New System.Text.RegularExpressions.Regex(pattern, _
System.Text.RegularExpressions.RegexOptions.Ignore Case)

Dim m As System.Text.RegularExpressions.Match

m = Eng.Match(s.Trim)

If m.Success Then

tmp(0) = CInt(m.Groups("Alpha").Value)
tmp(1) = CInt(m.Groups("Red").Value)
tmp(2) = CInt(m.Groups("Green").Value)
tmp(3) = CInt(m.Groups("Blue").Value)

Else
tmp(0) = -1
tmp(1) = -1
tmp(2) = -1
tmp(3) = -1

End If

Return tmp

End Function





پ.ن. من نمی‌دونم چرا بین Ignore و Case فاصله می‌افته، به هر حال فاصله‌ای وجود نداره.

SYSMAN
یک شنبه 16 مرداد 1384, 15:36 عصر
ممنون ولی در حالت کلی منظور هست. برای به دست آوردن کد رنگها کد ساده تری هم هست
مثلا از رشته "My cost = 3000$" عدد 3000 رو بخوای جدا کنی

یاشار
دوشنبه 17 مرداد 1384, 01:42 صبح
البته راه ساده تری هم هست :




Dim AList As New ArrayList ' to hold captured numbers
Dim Source As String ' the raw string

Dim Pattern As String = "\d+"
Dim Reg As New Regex(Pattern)
Dim Matches As MatchCollection = Reg.Matches(Source)

For Each m As Match In Matches
AList.Add(m.Value)
Next



ولی کدی که در پست دوم اومده، اعداد داخل String های زیر رو نادیده می‌گیره.

[Color [R=255, A=100, G=200, G=50
[Color [R=1/0, A=10000, G=20.5, G=-50
[Color [255- R= 0, A=100i , G=$200 , G=$50

چون مطابق الگویی که براش تعریف کردیم نیستند، بنابراین تا حد زیادی اطلاعاتی که اشتباه وارد شده رو فیلتر می‌کنه. البته هنوز باید یه کم روش کار بشه که اعداد بین 256 تا 999 رو هم قبول نکنه.

GentleGuy
دوشنبه 17 مرداد 1384, 05:31 صبح
چرا اینقدر کارو سخت میکننین ---> اینجوری راحت تره :

y = Mid("1384/05/16", 1, 4)
y = y
m = Mid(("1384/05/16", 6, 2)
m = CInt(m)
d = Mid(("1384/05/16", 9, 2)
d = CInt(d)
tb_date.Text = y & "/" & m & "/" & d
....................
متغییر مقصد=
mid تو پرانتزش -> متغیر مبدا - شماره کاراکتری که ازش شروع میکنه - چند تا کاراکتر برداره


mid(taghi,2,1)x
lمیشه a

یاشار
دوشنبه 17 مرداد 1384, 13:14 عصر
فکر نمی‌کنم از قبل جای اعداد در Strign مشخص باشه. تصور من این بود که در زمان اجرا کاربر یک String وارد می‌کنه و برنامه باید اعداد رو بیرون بکشه.

Mohammad .net
سه شنبه 18 مرداد 1384, 13:29 عصر
چرا اینقدر کارو سخت میکننین ---> اینجوری راحت تره :






Dim Color As String = "Color [A=255, R=100, G=200, B=50]"

For i As Integer = 1 To 4

MsgBox(Color.Split("=").GetValue(i).split(",").getvalue(0).replace("]", ""))

Next