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

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

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

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

מתוזמן נעוץ נעול הועבר תכנות
17 פוסטים 7 כותבים 537 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • חגיח מנותק
    חגיח מנותק
    חגי
    השיב ל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
                        • דף הבית
                        • קטגוריות
                        • פוסטים אחרונים
                        • משתמשים
                        • חיפוש
                        • חוקי הפורום