דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. פירוק מחרוזת לתווים יחידים באמצעות רג'קס

פירוק מחרוזת לתווים יחידים באמצעות רג'קס

מתוזמן נעוץ נעול הועבר תכנות
17 פוסטים 7 כותבים 537 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • צדיק תמיםצ מנותק
    צדיק תמיםצ מנותק
    צדיק תמים
    השיב לחגי ב נערך לאחרונה על ידי
    #8

    @חגי זה כבר לא רגקס, אבל אפשר לכאורה פשוט לעשות

    'abcd345'.split('') // ["a","b","c","d","3","4","5"]
    

    Don’t comment bad code — rewrite it." — Brian W. Kernighan and P. J. Plaugher"
    טיפים

    hp079H תגובה 1 תגובה אחרונה
    1
    • hp079H מנותק
      hp079H מנותק
      hp079
      השיב לצדיק תמים ב נערך לאחרונה על ידי
      #9

      @צדיק-תמים רק שים לב שביקשתי רג'קס בדווקא, כי הייתי צריך את זה לנוסחה שמקבלת רג'קס..

      תגובה 1 תגובה אחרונה
      1
      • חגיח מנותק
        חגיח מנותק
        חגי
        כתב ב נערך לאחרונה על ידי
        #10

        שמתי לב שיש תשובה יותר פשוטה ממש שכתבתי, ה-regex הבא:

        ()
        

        אמור לבצע אותו דבר.

        yossizY תגובה 1 תגובה אחרונה
        3
        • yossizY מנותק
          yossizY מנותק
          yossiz
          השיב לחגי ב נערך לאחרונה על ידי yossiz
          #11

          @חגי
          497e75ab-5095-466c-b60e-58d7693ea083-CleanShot 2022-08-22 at 20.53.05@2x.png

          מה הפשט? 🤔

          📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

          חגיח תגובה 1 תגובה אחרונה
          2
          • חגיח מנותק
            חגיח מנותק
            חגי
            השיב לyossiz ב נערך לאחרונה על ידי חגי
            #12

            @yossiz טעות שלי, בעיקרון () זה רגקס להתאים NULL בתוך המחרוזת, חשבתי מregex101 שזה מתאים בדיוק כמו \b|\B, לא בדקתי את זה בדפדפן

            9e947fb6-f14d-4c93-a87c-463b5f6b73b1-image.png

            וההסבר שלהם עונה את הכל:
            1st Capturing Group () — null, matches any position

            צריך עיון איך זה לא מתאים כלום, אבל באמת זה מתאים את הכל.
            במקרה הזה "הכל" זה כולל גם מה שמתאים . וגם מה שמתאים \b|\B, והכל ברגקס אחד.

            תגובה 1 תגובה אחרונה
            1
            • upsilon01U מנותק
              upsilon01U מנותק
              upsilon01
              כתב ב נערך לאחרונה על ידי upsilon01
              #13
              "asdsafs".split(/!?/)
              

              לא חייב דווקא ! אלא כל תו שבוודאות לא יימצא בסטרינג
              be2bccca-2169-4afd-87e9-7011d415822e-image.png

              צבי-שצ תגובה 1 תגובה אחרונה
              1
              • צבי-שצ מחובר
                צבי-שצ מחובר
                צבי-ש
                השיב לupsilon01 ב נערך לאחרונה על ידי
                #14

                @upsilon01 כתב בפירוק מחרוזת לתווים יחידים באמצעות רג'קס:

                "asdsafs".split(/!?/)
                

                לא חייב דווקא ! אלא כל תו שבוודאות לא יימצא בסטרינג
                be2bccca-2169-4afd-87e9-7011d415822e-image.png

                אני לא הייתי מסתמך על זה,
                כל עוד לא אני הוא זה שמכניס את המחרוזת

                כיף לגלות דברים חדשים.
                חוק ה-50-50-90: בכל פעם שיש סיכוי של 50-50 שמשהו יעבוד, יש סיכוי של 90 אחוז שהוא לא. מקור

                תגובה 1 תגובה אחרונה
                1
                • yossizY מנותק
                  yossizY מנותק
                  yossiz
                  כתב ב נערך לאחרונה על ידי yossiz
                  #15

                  @חגי רק עכשיו הבנתי מה ההסבר לפלט של "abc.split(/()/)‎"
                  ההסבר שלך לצערי לא הבנתי כלל

                  אבל ההסבר הנכון זה מה שכתוב ב-MDN פה
                  וביותר אריכות פה
                  ולחולים הקשים שבינינו פה ופה 😉

                  בקיצור ההתנהגות של split במקרה של רג'קס הוא ככה:

                  • אם הארגומנט הראשון של split הוא אובייקט עם מאפיין [Symbol.split] אז המימוש "מואצלת" לערך של שדה זו
                  • מכיון שלרג'קס יש מאפיין כזו, הוא אחראי על המימוש של split
                  • וכך הוא המימוש (פלוס מינוס):
                    • אינדקס = 0
                    • START:
                    • מחפשים התאמה לרג'קס מאינדקס עד סוף המחרוזת,
                    • אם הוא נמצא:
                      • אינדקס קודם = אינדקס
                      • אינדקס מעודכן לסוף ההתאמה
                      • אם אינדקס != אינדקס קודם, מכניסים למערך התוצאות את הדברים הבאים:
                        • התווים מאינדקס קודם עד לתחילת ההתאמה, כולל אם זו מחרוזת ריקה
                        • התוכן של כל הקבוצות הקיימות ברג'קס, כולל אם הם מחרוזות ריקות
                      • אם אינדקס == אינדקס קודם: => אינדקס++
                    • GOTO START

                  נ.ב. ההתנהגות זהה ל-split עם מחרוזת פשוטה, חוץ מהבדל היחיד ברג'קס שזה ההוספה של התוכן של כל הקבוצות

                  היוצא מזה ש:

                  _.isEqual(
                    "abc".split(/()/),
                    "abc".split(/(\b|\B)/)
                  )
                  // ['a', '', 'b', '', 'c']
                  
                  _.isEqual(
                    "abc".split(/(?:)/),
                    "abc".split(/\b|\B/)
                  )
                  // ['a', 'b', 'c']
                  

                  עוד ביאור לגבי /()/
                  רג'קס של כלום מתאים לכל מיקום במחרוזת.
                  רג'קס של () הוא רג'קס של כלום בתוך קבוצה, לכן זה מתאים לכל מקום ומכיון שהוא בקובצה מקבלים גם מחרוזת ריקה בפלט

                  בעקרון ההסבר הזה מספיק, רק שהתבלבתי לגבי ההתנהגות הנכונה כאשר ההתאמה של החיפוש הוא למחרוזת ריקה, לכן הבאתי את כל האלגוריתם.

                  גם למדתי שאפשר להשתמש בכל אובייקט שיש לו שדה של [Symbol.split] ולאו דוקא רג'קס

                  📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                  dovidD תגובה 1 תגובה אחרונה
                  4
                  • dovidD מנותק
                    dovidD מנותק
                    dovid ניהול
                    השיב לyossiz ב נערך לאחרונה על ידי dovid
                    #16

                    @yossiz האריך מאוד בהסברים כרגיל (ואנחנו רוצים שהוא ימשיך ככה)
                    אבל עבור מי שרוצה את זה קצר, עיקר השאלה של @yossiz הייתה מה פשר המחרוזות הריקות. split אמור לחלק את המחרוזת כל מקום שנמצא התאמה, הקטע הריק אינו חלק מהמחרוזת אלא מההתאמה.
                    (אני חושב שהתיאוריה של חגי הייתה שבABC הוא פשוט מחלק גם אחרי הA אך גם לפני הB וממילא נהיה פה "חתיכת" טקסט של 0).
                    התשובה שמצא @yossiz היא הסוגריים, הם יוצרים קבוצה. כלומר ברגקס שמופיע בו סוגריים, כמה כזה דבר:

                    'abc123abc123abc'.split(/12(3)/)
                    

                    בין כל abc יופיע גם חלק של 3 כי הוא קבוצה ברגקס:

                    ['abc', '3', 'abc', '3', 'abc']
                    

                    ומי שאחראי על ההחלטה המשונה (והשימושית) הזאת זה המחלקה רגקס ולא המתודה split (עיין בתשובתו של @yossiz).

                    ובעוד יותר קצר:
                    למרות שsplit לא כולל בחלוקת המחרוזת את המחלק שלה. אבל כן כולל בחלקים את הקבוצות של הרג'קס של כל מחלק...

                    מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                    בכל נושא אפשר ליצור קשר dovid@tchumim.com

                    yossizY תגובה 1 תגובה אחרונה
                    4
                    • yossizY מנותק
                      yossizY מנותק
                      yossiz
                      השיב לdovid ב נערך לאחרונה על ידי
                      #17

                      @dovid תודה 🙂
                      באמת אריכות דבריי לא מובנת למי שלא נכנס לתוך ראשי ומבין במה התקישיתי

                      התקשיתי גם איך נכנסים המחרוזות הריקות לפלט, וגם כי התבלבלתי איך באמת אמור להיות ההתנהגות כאשר יש התאמה למחרוזת ריקה, למשל אם זה בתחילת הקלט, האם מכניסים את המרוזת הריקה שלפני ההתאמה? האם מתקדמים עוד תו אחרי ההתאמה? ולמה? וכו'
                      מכיון שההשראה להסתבכות היו דברי חגי אז כתבתי כל הנ"ל בתשובה לדברי חגי, אבל באמת לא הכל קשור

                      📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                      תגובה 1 תגובה אחרונה
                      2

                      בא תתחבר לדף היומי!
                      • התחברות

                      • אין לך חשבון עדיין? הרשמה

                      • התחברו או הירשמו כדי לחפש.
                      • פוסט ראשון
                        פוסט אחרון
                      0
                      • דף הבית
                      • קטגוריות
                      • פוסטים אחרונים
                      • משתמשים
                      • חיפוש
                      • חוקי הפורום