الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيفية استخدام regexp في مطابقة الأرقام الحقيقية وفق شروط

بدأه Xacker في 13 مارس 2010 · 9 رد · 538 مشاهدة · في قسم البرمجة بــ Javascript
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته،

ليكن لدي المحتوى التالي:

98.00e-500 + 98.E56

f = 98.300e-500

98.E+56

98.

98.E-5

98.3e-5

98.3e+5

98.3E567

98.3e5

98.E56

0.3E55

0.3e1

0.3e+1

.3e50

.3e+5

.030E-50

-------------

00.E56

08.E56

98.3e088

98.23e

98.23+5

.e50

.e

.-50

.8e08

والمطلوب أن أحصل بعد تنفيذ regexp على كل الأرقام الحقيقية التي تعلو السطر المنقط (فقط - نفترض أن جميع الأرقام التي تعلوه صحيحة وجميع الأرقام التي أسفله خاطئة كتمثيل)

هذا هو الـ Expression الذي كتبته

(^[1-9]+[0-9]*\.[0-9]*|^0\.[0-9]*|^\.[0-9]+)([eE][+\-]?[0-9]+)?

والذي أحصل بنتيجته على

Match Number	Match Text	Group 1		Group 2
0		"98.00e-500"	"98.00"		"e-500"
1		"98.E+56"	"98."		"E+56"
2		"98."		"98."		""
3		"98.E-5"	"98."		"E-5"
4		"98.3e-5"	"98.3"		"e-5"
5		"98.3e+5"	"98.3"		"e+5"
6		"98.3E567"	"98.3"		"E567"
7		"98.3e5"	"98.3"		"e5"
8		"98.E56"	"98."		"E56"
9		"0.3E55"	"0.3"		"E55"
10		"0.3e1"		"0.3"		"e1"
11		"0.3e+1"	"0.3"		"e+1"
12		".3e50"		".3"		"e50"
13		".3e+5"		".3"		"e+5"
14		".030E-50"	".030"		"E-50"
15		"98.3e088"	"98.3"		"e088"
16		"98.23"		"98.23"		""
17		"98.23"		"98.23"		""
18		".8e08"		".8"		"e08"

ولو قمت بتغييره بشكل طفيف جداً

([1-9]+[0-9]*\.[0-9]*|^0\.[0-9]*|^\.[0-9]+)([eE][+\-]?[0-9]+)?

أحصل بنتيجته على

Match Number	Match Text	Group 1		Group 2
0		"98.00e-500"	"98.00"		"e-500"
1		"98.E56"	"98."		"E56"
2		"98.300e-500"	"98.300"	"e-500"
3		"98.E+56"	"98."		"E+56"
4		"98."		"98."		""
5		"98.E-5"	"98."		"E-5"
6		"98.3e-5"	"98.3"		"e-5"
7		"98.3e+5"	"98.3"		"e+5"
8		"98.3E567"	"98.3"		"E567"
9		"98.3e5"	"98.3"		"e5"
10		"98.E56"	"98."		"E56"
11		"0.3E55"	"0.3"		"E55"
12		"0.3e1"		"0.3"		"e1"
13		"0.3e+1"	"0.3"		"e+1"
14		".3e50"		".3"		"e50"
15		".3e+5"		".3"		"e+5"
16		".030E-50"	".030"		"E-50"
17		"8.E56"		"8."		"E56"
18		"98.3e088"	"98.3"		"e088"
19		"98.23"		"98.23"		""
20		"98.23"		"98.23"		""
21		".8e08"		".8"		"e08"

وهذا أراه أفضل من السابق لكنه يحتاج إلى فلترة بعض الأرقام التي يتم أخذها من أسفل السطر.

طبعاً الأخطاء التي أنا فيها أستطيع أن أحددها لكن المشكلة أني لم أستطع جعل التعبير عام (وهو ليس بشرط أي أنه بإمكاني تقسيمه إلى عدة Expressions لو أردت)

هل أجد مساعدة..

مع الشكر سلفاً.

تم تعديل هذه المشاركة بواسطة Xacker في 13 مارس 2010 في 16:43

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#2

ما هي الشروط لكي تعتبر الكتابة صحيحة؟؟

تم تعديل هذه المشاركة بواسطة herch في 13 مارس 2010 في 17:29

#3
herch كتب:

ما هي الشروط لكي تعتبر الكتابة صحيحة؟؟

post-7008-12684948501311_thumb.png

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#4

جرب التعبير التالي

(((0|[1-9][0-9]*)\\.[0-9]*|\\.[0-9]+)([eE][+\\-]?[1-9][0-9]*)?)|[1-9][0-9]*[eE][+\\-]?[1-9][0-9]*
#5

جربت ما اقترحته فكانت النتيجة غير مقبولة أبداً

Match Number	Match Text Group 1 	 Group 2 	 Group 3 	 Group 4
0 	 "300e-500" "" 	 "" 	 "" 	 ""
1 	 "3e-5" 	 "" 	 "" 	 "" 	 ""
2 	 "3e+5" 	 "" 	 "" 	 "" 	 ""
3 	 "3E567" 	 "" 	 "" 	 "" 	 ""
4 	 "3e5" 	 "" 	 "" 	 "" 	 ""
5 	 "3E55" 	 "" 	 "" 	 "" 	 ""
6 	 "3e1" 	 "" 	 "" 	 "" 	 ""
7 	 "3e+1" 	 "" 	 "" 	 "" 	 ""
8 	 "3e50" 	 "" 	 "" 	 "" 	 ""
9 	 "3e+5" 	 "" 	 "" 	 "" 	 ""
10 	 "30E-50" "" 	 "" 	 "" 	 ""

وأزلت double forward slash حيث جعلتها واحدة فقط وكانت النتيجة

Match Number	Match Text 	 Group 1 	 Group 2 	 Group 3 	 Group 4
0 	 "98.00e-500"	"98.00e-500"	"98.00" 	 "98" 	 "e-500"
1 	 "98.E56" 	 "98.E56" 	 "98." 	 "98" 	 "E56"
2 	 "98.300e-500" "98.300e-500" "98.300" "98" 	 "e-500"
3 	 "98.E+56" 	 "98.E+56" 	 "98." 	 "98" 	 "E+56"
4 	 "98." 	 "98." 	 "98." 	 "98" 	 ""
5 	 "98.E-5" "98.E-5" 	 "98." 	 "98" 	 "E-5"
6 	 "98.3e-5" "98.3e-5" 	 "98.3" 	 "98" 	 "e-5"
7 	 "98.3e+5" "98.3e+5" 	 "98.3" 	 "98" 	 "e+5"
8 	 "98.3E567" "98.3E567" "98.3" 	 "98" 	 "E567"
9 	 "98.3e5" "98.3e5" "98.3" 	 "98" 	 "e5"
10 	 "98.E56" "98.E56" "98." 	 "98" 	 "E56"
11 	 "0.3E55" "0.3E55" "0.3" 	 "0" 	 "E55"
12 	 "0.3e1" 	 "0.3e1" 	 "0.3" 	 "0" 	 "e1"
13 	 "0.3e+1" "0.3e+1" "0.3" 	 "0" 	 "e+1"
14 	 ".3e50" 	 ".3e50" 	 ".3" 	 "" 	 "e50"
15 	 ".3e+5" 	 ".3e+5" 	 ".3" 	 "" 	 "e+5"
16 	 ".030E-50" ".030E-50" ".030" 	 "" 	 "E-50"
17 	 "0.E56" 	 "0.E56" 	 "0." 	 "0" 	 "E56"
18 	 "8.E56" 	 "8.E56" 	 "8." 	 "8" 	 "E56"
19 	 "98.3" 	 "98.3" 	 "98.3" 	 "98" 	 ""
20 	 "98.23" 	 "98.23" 	 "98.23" 	 "98" 	 ""
21 	 "98.23" 	 "98.23" 	 "98.23" 	 "98" 	 ""
22 	 ".8" 	 ".8" 	 ".8" 	 "" 	 ""

تقريباً ذات المشكلة مع الأرقام التي أسفل الخط تكون المطابقة partial (بالمناسبة أنا أستخدم Expresso للتجربة)

تم تعديل هذه المشاركة بواسطة Xacker في 13 مارس 2010 في 22:44

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#6

جرب التالي

(^((0|[1-9][0-9]*)\.[0-9]*|\.[0-9]+)([eE][+\-]?[1-9][0-9]*)?)\s|^[1-9][0-9]*[eE][+\-]?[1-9][0-9]*\s

لكن هناك مشكل مع السطرين الأولين

#7

0 مطابقة !

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#8

غريب.

جرب في هذا الموقع http://www.rexv.org في ال tab الخاص ب javascript

أو ابحث في البرنامج الذي تستعمله عن كيفية إضافة ال modifers

multi-line mode

global

تم تعديل هذه المشاركة بواسطة herch في 13 مارس 2010 في 23:24

#9

فعلتها بهذا التعبير

(\b([1-9][0-9]*\.)([eE][+\-]?[1-9][0-9]*))|(([1-9][0-9]*\.[0-9]+)([eE][+\-]?[1-9][0-9]*))|([1-9][0-9]*\.\B)|(\b(0\.[0-9]*)([eE][+\-]?[1-9][0-9]*)\b)|(\B(\.[0-9]+)([eE][+\-]?[1-9][0-9]*)?\b)

dirty coding :P

ممكن دمج بعض الأجزاء ببعضها البعض والاستعاضة عن [0-9] بـ \d لتحسين الظهور.

تم تعديل هذه المشاركة بواسطة Xacker في 14 مارس 2010 في 00:24

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#10

وبتعديل بسيط تصبح جميع الطلبات محققة كما في الصورة التي أرفقتها سابقاً..

ربنا يستر ما يكون في احتمالات أخرى تخرب التعبير :wacko:

(\b([1-9][0-9]*\.)([eE][+\-]?[1-9][0-9]*))|(([1-9][0-9]*\.[0-9]+)([eE][+\-]?[1-9][0-9]*))|([1-9][0-9]*\.\B)|(\b(0\.[0-9]*)([eE][+\-]?[1-9][0-9]*)\b)|(\B(\.[0-9]+)([eE][+\-]?[1-9][0-9]*)?\b)|(\b([1-9][0-9]*)([eE][+\-]?[1-9][0-9]*))

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…