سؤال

أحاول الحصول على معلومات ملونة قمت بتخزينها في ملف نصي ثم استخدام هذا اللون كطريق للطرق للحصول على تسمية. ولكن، في وقت التشغيل عندما انقر فوق الزر للقيام بذلك، فإنه لا يعطيني أي رسائل خطأ أو أي شيء. الرمز الذي لدي أدناه:

MatchCollection lines = Regex.Matches(File.ReadAllText(Path), @"(.+?)\r\n""([^""]+)""\r\n(\d+),\s(\d+)\r\n([\w\s]*)\r\n(\d+\.\d+)""\r\n(\d+?)");
        foreach (Match match in lines)
            int color = Int32.Parse(match.Groups[5].Value);

لدي Regex أخرى لملفات Info Inn Inn أيضا، لكن Regex الآخر ليس المشكلة. المشكلة هي Regex التي أضفتها للتو لمحاولة مطابقة اللون (Argb). إنه في نهاية السلسلة:

\r\n(\d+?)

حتى الآن كما أفهمها، فإن الشيء القليل من regex أعلاه يعني أن هذا: "ابحث عن العرب و Newline، ثم 1 أو أكثر من الأرقام ولكن لا تكون جشعا". هل هذا صحيح؟

يمكن للشخص الرجاء مساعدتي مع هذا. شكرا جزيلا.

ملاحظة: معلومات الألوان المحفوظة في الملف النصي هي رقم سالب (لون Argb):

-16744193

محتويات الملفات هي مثل هذا:

Control
Control Text
Control Location
Control Font Name
Control Font Size
Control Font Color

تفسير:

Label
"this is a label"
23, 77
Tahoma
14.0
-55794414

لذلك، يعمل Regex، يحصل على جميع التفاصيل الأخرى بشكل صحيح ولكنه لا يحصل على معلومات اللون.

هل كانت مفيدة؟

المحلول

ريجيكس الخاص بك ليس المشكلة. Regex الخاص بك وكذلك واحد معين من قبل WIM يعمل بشكل جيد. لذلك يجب أن تكون المشكلة مع طريقة التعامل مع المدخلات.

فيما يلي بعض الأشياء التي يمكنك تجربتها:

قم بتشغيل هذا مع إدخال مختلف، أي بدلا من استخدام هذا الرقم:

-16744193

استخدام شيء مثل هذا بدلا من ذلك:

100
-100

ثم قم بطباعة القيمة بعد هذا الخط:

int fcolor = Int32.Parse(match.Groups[7].Value);

ونرى ما هو عليه.

شيء آخر لتوفير الوقت يجب أن تفعله هو طباعة القيم في

match.Groups[1].Value
match.Groups[2].Value
match.Groups[3].Value
match.Groups[4].Value
match.Groups[5].Value
match.Groups[6].Value
match.Groups[7].Value
match.Groups[8].Value

ونشرها هنا. هذا سيجعل من السهل عليك وكذلك معرفة المشكلة.

نصائح أخرى

- غير متطابق \d. وبعد أيضا، إذا كنت تفعل مباراة غير جشعة \d+ سيتم التقاط الرقم الأول فقط لأن هذا يرضي Regexp. تغيير regexp الخاص بك في (-?\d+) لتتناسب مع اختياري - في بداية رقمك وكأن العديد من الأرقام حيث يوجد في الرقم، ما يصل إلى (ولكن ليس بما في ذلك) الحرف بعد الرقم (Newline، نهاية السلسلة، ...).

جرب هذا Regex ومعرفة ما إذا كان يعمل.

(. +؟) r n "" ([^ ""] +) "" r n ( n +)، s ( d +) r n ([ w s] *) R n ( d +. d +) r n (-؟ d +)

يبدو أن Regex الخاص بك يبحث عن "بعد قيمة حجم الخط.

أيضا، سيكون لون ARGB في مباراة المجموعة 7، وليس 5.

أقوم بتعيين نقطة توقف على الخط مع الخطأ ومعرفة ما match.Groups[5].Value حقا هو.

أنا أراهن أنه لا يمكن تحويله إلى int.

طباعة قيم المطابقة كما هو مقترح في مكان آخر سيكون مساعدة، وكذلك تقصير Regexp لتسهيل عزل المشكلة.

ولكن يمكنني اقتراح شيء واحد آخر. إليك الجزء الأخير من Regexp بدءا من مطابقة حجم الخط:

..."(\d+\.\d+)\r\n(-?\d+)"

التي من المفترض أن تتطابق مع

...
14.0
-55794414

نظرا لأن لديك المباراة للحصول على Newline مباشرة بعد المباراة لأرقام حجم الخط، فسوف تفشل المباراة إذا كان لديك مساحة بعد 14.0. محاولة مع

..."(\d+\.\d+)\s*\r\n(-?\d+)"

والتي يجب أن تعمل مع وبدون مساحات زائدة. (اعتمادا على محرك Regexp الخاص بك، فقط "\s*" قد يكون أفضل من "\s*\r\n".)

هناك بالفعل مجموعة كاملة من الأشياء الأخرى التي يمكن أن تخطئ. من الأسهل بشكل عام تقسيم السلاسل والعمل مع Regexps الأصغر.

أفترض أنك تعرف بالفعل الاقتباس؟

بعض الناس، عندما واجهوا مشكلة، فكر في "أعرف، سأستمر تعبيرات منتظمة." الآن لديهم مشكلتين.

لديك 4 مجموعات فقط في تعبيراتك العادية، لكنك تحاول الوصول إلى المجموعات من 5 إلى 8 والتي ستكون سلاسل فارغة، ولا يمكن تحليل سلسلة فارغة كعدد صحيح بواسطة Int32.parse.

يمكنك استخدام هذا Regex:

@"(.+)\r\n""([^""]+)""\r\n(\d+),\s(\d+)\r\n([\w\s]*)\r\n(\d+\.\d+)\r\n(-?\d+)"

مثال على الاستخدام الذي يمكن رؤيته أنه يعمل:

string value = @"Label
""this is a label""
23, 77
Tahoma
14.0
-55794414
Label
""this is a label""
23, 77
Tahoma
14.0
-55794415";

MatchCollection lines = Regex.Matches(
 value,
 @"(.+)\r\n""([^""]+)""\r\n(\d+),\s(\d+)\r\n([\w\s]*)\r\n(\d+\.\d+)\r\n(-?\d+)");
var colors = new List<int>();
foreach (Match match in lines)
{
    colors.Add(Int32.Parse(match.Groups[7].Value));
}

CollectionAssert.AreEquivalent(new[] { -55794414, -55794415}, colors);

في هذا المثال، لدينا 2 ملصقات بألوان مختلفة، كما يمكن أن ينظر إلى أن Regex يطابق الألوان.

مجموعات Regex:

  • 0: مراقبة
  • 1: نص
  • 2: X.
  • 3: Y.
  • 4: الخط
  • 6: بحجم
  • 7: لون
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top