سؤال

يا شباب بالنظر إلى مجموعة من البيانات في نص عادي مثل ما يلي:

==Events==
* [[312]] – [[Constantine the Great]] is said to have received his famous [[Battle of Milvian Bridge#Vision of Constantine|Vision of the Cross]].
* [[710]] – [[Saracen]] invasion of [[Sardinia]].
* [[939]] – [[Edmund I of England|Edmund I]] succeeds [[Athelstan of England|Athelstan]] as [[King of England]].
*[[1275]] – Traditional founding of the city of [[Amsterdam]].
*[[1524]] – [[Italian Wars]]: The French troops lay siege to [[Pavia]].
*[[1553]] – Condemned as a [[Heresy|heretic]], [[Michael Servetus]] is [[burned at the stake]] just outside [[Geneva]].
*[[1644]] – [[Second Battle of Newbury]] in the [[English Civil War]].
*[[1682]] – [[Philadelphia]], [[Pennsylvania]] is founded.

أود أن ينتهي NSDictionary أو أي شكل آخر من جمع لدرجة أنني يمكن أن يكون في السنة (رقم على اليسار) الخرائط مقتطفات (النص على اليمين).لذلك هذا هو ما 'قالب' مثل:

*[[YEAR]] – THE_TEXT

على الرغم من أنني أود مقتطفات أن يكون نص عادي ، لا ويكي العلامات حتى لا [[ مجموعات.في الواقع, هذا يمكن أن يكون من الصعب مع الاسم المستعار الروابط مثل [[Edmund I of England|Edmund I]].

أنا لا خبرة مع التعبيرات العادية لذلك لدي بعض الأسئلة.يجب أولا محاولة 'تجميل' البيانات ؟ على سبيل المثال إزالة السطر الأول الذي سوف يكون دائما ==Events==, وإزالة [[ و ]] التكرارات ؟

أو ربما حل أفضل:يجب أن أفعل هذا في الدعوات ؟ هكذا على سبيل المثال, الأول يمر أستطيع فصل كل خط في * [[710]] و [[Saracen]] invasion of [[Sardinia]].وتخزينها في مختلف NSArrays.

ثم تذهب من خلال أول NSArray سنوات فقط الحصول على النص داخل [[]] (أقول نص وليس رقم لأنه يمكن أن يكون 530 قبل الميلاد) ، وذلك * [[710]] يصبح 710.

ثم مقتطفات NSArray, تذهب من خلال وإذا [[some_article|alias]] وجدت تجعل فقط [[alias]] بطريقة أو بأخرى, ثم إزالة كافة [[ و ]] مجموعات?

هل هذا ممكن ؟ يجب استخدام التعبيرات العادية?هل هناك أي أفكار يمكن أن تأتي مع التعبيرات العادية يمكن أن تساعد ؟

وذلك بفضل!أنا حقا نقدر ذلك.

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

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

المحلول

هذا الرمز تفترض كنت تستخدم RegexKitLite:

NSString *data = @"* [[312]] – [[Constantine the Great]] is said to have received his famous [[Battle of Milvian Bridge#Vision of Constantine|Vision of the Cross]].\n\
    * [[710]] – [[Saracen]] invasion of [[Sardinia]].\n\
    * [[939]] – [[Edmund I of England|Edmund I]] succeeds [[Athelstan of England|Athelstan]] as [[King of England]].\n\
    *[[1275]] – Traditional founding of the city of [[Amsterdam]].";

    NSString *captureRegex = @"(?i)(?:\\* *\\[\\[)([0-9]*)(?:\\]\\] \\– )(.*)"; 

    NSRange captureRange;
    NSRange stringRange;
    stringRange.location = 0;
    stringRange.length = data.length;

    do 
    {
        captureRange = [data rangeOfRegex:captureRegex inRange:stringRange];
        if ( captureRange.location != NSNotFound )
        {
            NSString *year = [data stringByMatching:captureRegex options:RKLNoOptions inRange:stringRange capture:1 error:NULL];
            NSString *textStuff = [data stringByMatching:captureRegex options:RKLNoOptions inRange:stringRange capture:2 error:NULL];
            stringRange.location = captureRange.location + captureRange.length;
            stringRange.length = data.length - stringRange.location;
            NSLog(@"Year:%@, Stuff:%@", year, textStuff);
        }
    }
    while ( captureRange.location != NSNotFound );

علما أن كنت حقا بحاجة إلى دراسة حتى على RegEx لبناء هذه جيدا, ولكن هنا ما لدي هو يقول:

(?i)

تجاهل الحالة ، يمكن أن يكون ترك ذلك منذ أنا لا مطابقة الحروف.

(?:\* *\[\[)

?:يعني لا التقاط هذه الكتلة ، أهرب * لتتناسب مع ذلك ، ثم هناك صفر أو أكثر الأماكن (" *") ثم الهروب من اثنين من الأقواس (منذ قوسين أيضا أحرف خاصة في regex).

([0-9]*)

الاستيلاء على أي شيء عددا.

(?:\]\] \– )

هنا حيث يمكننا تجاهل الأشياء مرة أخرى ، أساسا مطابقة " – ".ملاحظة أي "\" في regex علي أن أضيف واحد آخر في الهدف-C سلسلة أعلاه منذ "\" هو طابع خاص في سلسلة...ونعم هذا يعني مطابقة regex هرب واحد "\" وينتهي إلى "\\" في Obj-C سلسلة.

(.*)

مجرد الاستيلاء على أي شيء آخر ، افتراضيا RegEX المحرك سوف يتوقف مطابقة في نهاية الخط الذي هو السبب في أنه لا تتطابق مع أي شيء آخر.سيكون لديك لإضافة رمز إلى قطاع من [[LINK]] الأشياء من النص.

على NSRange المتغيرات تستخدم للحفاظ على مطابقة من خلال الملف دون إعادة مطابقة الأصلي المباريات.إذا جاز التعبير.

لا تنسى بعد إضافة RegExKitLite فئة الملفات تحتاج أيضا إلى إضافة خاصة linker العلم أو سوف تحصل على الكثير من أخطاء الارتباط (على RegexKitLite الموقع يحتوي على إرشادات التثبيت).

نصائح أخرى

أنا لست جيدة مع التعابير العادية ، ولكن هذا يبدو وكأنه عمل لهم.أتصور regex أن حل هذه المسألة بالنسبة لك بسهولة تامة.

إلقاء نظرة على RegexKitLite المكتبة.

إذا كنت تريد أن تكون قادرة على تحليل Wikitext في العام ، لديك الكثير من العمل للقيام به.واحد فقط عامل تعقيد هو القوالب.كيف بذل الكثير من الجهد هل تريد أن تذهب إلى التعامل مع هؤلاء ؟

إذا كنت جادا في ذلك ، ربما يجب أن تبحث عن القائمة المكتبة التي يوزع Wikitext.نظرة سريعة جولة يجد هذا CPAN المكتبة, ولكن أنا لم تستخدم, لذلك لا أستطيع أن أذكر أنها توصية شخصية.

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

حظا سعيدا!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top