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

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

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

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

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

    כיצד אני יכול לפצל מחרוזת טקסט כגון: a5bc12H34
    לתוים יחידים, היינו שיהיה: a 5 b c 1 2 H 3 4
    באמצעות רג'קס?

    אני רוצה להשתמש בזה בגוגל שיטס בפונקציה REGEXREPLACE

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

      @hp079
      אני לא בקיא בנבכי הגוגל שיטס, אבל הרג'קס \B|\b עובד לי בjavascript:

      'a5bc12H34'.split(/\B|\b/)
      

      הסבר, \B יתאים את התווים בין התווים שהם לא בין מילה (כלומר לא תווים, הוא תואם את המקום שביניהם), ואילו \b יתאים בין התווים שבתחילת וסוף מילה (בין התווים!), אז זה בעצם רג'קס שמתאים "בין התווים" ולא את התווים עצמם

      בגלל שאין לי מושג אם הצלחתי להסביר את עצמי, אז אני אשאיר את הקישור הזה שאולי ימחיש את זה יותר טוב
      https://regex101.com/r/H0mSzI/1

      צדיק תמיםצ yossizY 2 תגובות תגובה אחרונה
      3
      • צדיק תמיםצ מנותק
        צדיק תמיםצ מנותק
        צדיק תמים
        השיב לחגי ב נערך לאחרונה על ידי
        #3

        @חגי באיזה מקרים הרג'קס הזה יהיה יותר טוב מאשר פשוט split('')?

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

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

          @צדיק-תמים
          הוא רוצה דוקא regex, אז זה מה שהבאתי.

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