PDA

View Full Version : جدا کردن رشته ای خاص از یک رشته



masoud_z_65
دوشنبه 16 مرداد 1391, 14:49 عصر
با سلام به دوستان عزیز
من یک رشته دارم به عنوان مثال : 29p23
که میخوام قسمت : 29P
رو ازش بردارم و فقط 23 رو ازش میخوام
کسی میتونه کمکم کنه؟

masoud_z_65
دوشنبه 16 مرداد 1391, 14:53 عصر
دوستان از
SkipWhile
میتونم استفاده کنم؟
اگه آره نحوه کدنویسیش با Oveload هاش رو کسی بهم یاد میده

مهرداد صفا
دوشنبه 16 مرداد 1391, 15:16 عصر
سلام
چرا از Remove استفاده نمیکنید.
string a="29p23";
a=a.Remove(0,3);
از کاراکتر 0 به تعداد سه کاراکتر حذف شد و حاصل مجددا در a قرار گرفت.

masoud_z_65
دوشنبه 16 مرداد 1391, 15:21 عصر
آخه مشکلم اینه که نمیدونم دقیقا چندتاست
شاید 4 تا بشه
232p34
یعنی از p به بعد رو میخوام
اینجوری استفاده کردم بازم نشد:



int index1 = c1.Code.IndexOf("p".ToString());
string string1 = c1.Code.Substring(index1, c1.Code.Length);

masoud_z_65
دوشنبه 16 مرداد 1391, 15:23 عصر
یعنی خواستم جای p رو پیدا کنم و از بعد از اون رو بریزم توی رشتم اما p رو تشخیص نمیده و ایندکس اون رو -1 بر میگردونه و باعث پیغام خطا میشه!!

mehran788
دوشنبه 16 مرداد 1391, 15:23 عصر
سلام.از substring استفاده کن

string a="Mehran";
string b=a.substring(Start Point,Lenght);

start point نقطه شروع رشته ای که می خوای برداری.و lenght طول این رشته است

masoud_z_65
دوشنبه 16 مرداد 1391, 15:26 عصر
ممنون دوست خوبم اما پست بالا منم همین رو نوشتم نشد!

mehran788
دوشنبه 16 مرداد 1391, 15:32 عصر
اینطوری می تونی ابتدا یکی یکی کاراکتر ها رو بررسی کنی و وقتی به p رسیدی index اون رو نگه داری و سپس هرچی بعد از اون هست رو برداری

masoud_z_65
دوشنبه 16 مرداد 1391, 15:37 عصر
خب این بدترین روشه سربار زیادی به وجود میاد چون تعداد رشته هام فوق العاده زیاده و توی حلقست

روش بهتری نیست؟؟؟

mehran788
دوشنبه 16 مرداد 1391, 15:37 عصر
for (int i=0;i<=a.lenght-1;i++);
string b=a.substring(i,1);
if (b=="P");
string c=a.substring(i,a.lenght-i);

حالا c جوابی که شما می خوای هست دیگه

masoud_z_65
دوشنبه 16 مرداد 1391, 15:45 عصر
بله جواب من هست ممنون

حالا اگه کسی روش بهتری داره که مستقیم بتونم ایندکس p رو بدست بیارم
یا نه حتی روش بهتری کلا هست بگه واقعا ممنون میشم

چون اینجوری تعداد حلقه هام زیاد میشه در ضمن خود رشته های من هم تعدادشون زیاده و سربار زیادی خواهم داشت
ممنون

masoud_z_65
دوشنبه 16 مرداد 1391, 15:49 عصر
یک نمونه چند خطی از متنی که مدنظرتون هست رو بزارید و بگید چه زیررشته هایی رو میخواهید جدا کنید.

ببین دوست خوبم من رشته هام طولشون زیاد نیست
درضمن دوستان ببخشید اصلا حواسم نبود....حتی حرفم هم مشخص نیست.هرچیزی میتونه باشه(p,m,n,.....) تازه متوجه شدم حواسم نبود شرمنده.
اما اینجوری میتونن باشن:
29p31
29p567
567p39
1n345
23m1

کلا یک (حرف) وسط تعداد نا مشخصی از اعداد هست که اعداد سمت راست اون حرف( مثلاp) رو میخوام

masoud_z_65
دوشنبه 16 مرداد 1391, 16:04 عصر
for (int i=0;i<=a.lenght-1;i++);
string b=a.substring(i,1);
if (b=="P");
string c=a.substring(i,a.lenght-i);

حالا c جوابی که شما می خوای هست دیگه

دوست عزیز بازم p رو تشخیص نمیده!
دیباگ میکنم اونجا که شرط رو چک میکنه "p"="p"
ازش رد میشه و true نمیشه شرطم

harani
دوشنبه 16 مرداد 1391, 16:24 عصر
خدمت شما :


string RemoveText(string text)//a
{


for (int i = 0; i < text.Length; i++)//e
{
if (!char.IsDigit(text[i]))//d
{
text = text.Replace(text[i].ToString(), string.Empty);//c
}
}
return text;//a
}

Mahmoud.Afrad
دوشنبه 16 مرداد 1391, 16:25 عصر
در مورد عبارات باقاعده تحقیق کنید

این هم جواب سوالتون
Regex rex = new Regex(@"[a-zA-Z]{1}" , RegexOptions.IgnoreCase);
textBox1.Text.Split('\n').ToList().ForEach(i =>
{
if (rex.Match(i).Success)
listBox2.Items.Add(i.Split(Convert.ToChar(rex.Matc h(i).ToString())).Last());
});

maktoom
دوشنبه 16 مرداد 1391, 21:53 عصر
سلام
می تونی اول رشتت رو به آرایه تبدیل کنی پیداش کنی حذف کنی و مابقی رو دوباره تبدیل کنی به رشته و استفاده کنی.

mehdi.mousavi
پنج شنبه 19 مرداد 1391, 12:42 عصر
سلام.
از اونجاییکه در پاسخ شماره 14، از Replace در یک حلقه استفاده شده و Replace باعث تغییر Instance فعلی string نمیشه (بلکه Instance جدیدی new میشه و مقدار مورد نظر در اون ریخته میشه)، بنابراین Performance بالایی نخواهد داشت (اگر قرار باشه به تعداد دفعات زیاد این کار تکرار بشه). پاسخ شماره 15، یعنی استفاده از RegEx ها هم که مشخصا Performance خوبی نداره... بنابراین هر دو پاسخ رو (با کمال احترام) رد می کنم.

بنظرم شما در یک حلقه while براحتی می تونید به هدفتون برسید:

private string ExtractNumber(string input)
{
int i = input.Length - 1;
while (i >= 0 && char.IsDigit(input[i]))
i--;

return input.Substring(i + 1);
}


دقت کنید که در کد فوق از انتهای رشته شروع می کنم و فقط تا جایی پیش میرم که به اولین کاراکتر غیر عددی بربخورم. وقتی جای اولین کاراکتر غیر عددی از سمت راست تعیین شد، اونوقت با دستور SubString مقدار مورد نظر رو برمیگردونم.

موفق باشید.

پاورقی: استفاده از Parallel در LINQ میتونه تاثیر بسزایی در بالا بردن سرعت Performance الگوریتم در CPU های Multicore داشته باشه، بنابراین برای گرفتن بهترین Performance می تونید کد فوق رو در غالب دستورات LINQ و بصورت Parallel بکار بگیرید.

tooraj_azizi_1035
پنج شنبه 19 مرداد 1391, 15:47 عصر
سلام
چون می دانیم قبل از عددی که می خواهیم برداریم حتماً یک حرف وجود دارد پس:


Regex rex = new Regex(@"\d+$" , RegexOptions.IgnoreCase);
rex.Match(YourString);//Contains 12 in 165p12


$ باعث می شود تا آخرین عدد برداشته شود مثلا برای 165p12 خروجی 12 است.