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

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

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

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

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

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

    @חגי תודה זה אכן עובד לי, עזרת לי מאוד.

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

      @חגי למה לא . זה מתאים לכל תו בלי טריקים?

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

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

        @yossiz
        אני לא רוצה להתאים "תו", אני רוצה להתאים את מה שביניהם (בעיקרון זה כלום, אבל יש רג'קס לכלום הזה), ואני מפצל באמצעות הכלום הזה, מה שמשאיר לי את כל התווים מפוצלים
        ded1bd12-4a3f-43b1-82d1-06304dc93a29-image.png

        אם אני מפצל באמצעות ., אז כל מה שנשאר לי הוא הכלום שבין התווים 🙂 (לכן יש 10 מחרוזות ריקות, הכלום הזה נמצא גם לפני התו הראשון וגם אחרי האחרון)

        צדיק תמיםצ תגובה 1 תגובה אחרונה
        3
        • צדיק תמיםצ מנותק
          צדיק תמיםצ מנותק
          צדיק תמים
          השיב לחגי ב נערך לאחרונה על ידי
          #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
                            • דף הבית
                            • קטגוריות
                            • פוסטים אחרונים
                            • משתמשים
                            • חיפוש
                            • חוקי הפורום