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

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

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

REGEX - איך מחפשים תו שנמצא לא בתחילת או סיום המחרוזת?

מתוזמן נעוץ נעול הועבר תכנות
12 פוסטים 2 כותבים 333 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • א מנותק
    א מנותק
    אהרן
    השיב לdovid ב נערך לאחרונה על ידי
    #3

    @dovid
    שניהם לא

    'aaaaaaa'.replace(/.a./g, '')
    

    אני רוצה שה-a הראשון והאחרון לא ימחק.

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

      הם כן. אלא שלא ידעתי שהנושא הוא לא איתור התו אלא מחיקתו ע"י replace.
      אפשר להשתמש עם פונקצייה בארגומנט השני ואז הביטוי השני מצויין, אם אתה שם קבוצות מסביב לסוגריים המרובעות.
      ואכן הדרך היותר נכונה במקרה זה היא שימוש בNegative Lookbehind זה מאפשר לעשות שלילה בלי לכלול את מיקום השלילה בביטוי.

       (?<!^).(?<!$)
      

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

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

      א 3 תגובות תגובה אחרונה
      0
      • א מנותק
        א מנותק
        אהרן
        השיב לdovid ב נערך לאחרונה על ידי
        #5

        @dovid
        נתתי לי שיעורי בית, אני הולך לשבת ע"ז!

        בנתיים, כנראה ששוב לא הסברתי את עצמי מספיק טוב

        אני רוצה ש

        'abababababa'.replace(/(?<!^).(?<!$)/g, '')
        

        יוציא פלט abbbbba

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

          ככה

          'abababababa'.replace(/(?<!^)a(?<!$)/g, '')
          

          תודה!

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

            @dovid אמר בREGEX - איך מחפשים תו שנמצא לא בתחילת או סיום המחרוזת?:

            לא ידעתי שהנושא הוא לא איתור התו אלא מחיקתו ע"י replace

            מדוע שיהיה הבדל?

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

              @dovid
              יש לי כמה שאלות

              .+(.).+
              [^$].[^^]
              

              את הפקודה אני די מבין, חפש כל תו שיש לפניו ולאחריו תו (+ = לפחות מופע אחד, . = כל תו)
              לא מבין אבל 1) מדוע 'ababacbabab'.replace((.+)(a)(.+)/g, '$1') לא תקין 2) מדוע באמצע יש גם נקודה (= כל תו) 3) על איזה פונקצית איתור כתבת שכן עובד?

              לגבי השורה השניה, 1) קודם כל הסדר נראה לי הפוך, סימון $ אומר סוף המחרוזת, מדוע פה הוא בתחילת החיפוש? 2) מדוע הפונקציה הזו 'ababacbabab'.replace([^$].[^^]/g, '') מוציאה שגיאה?

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

              אשמח מאוד לדוגמא.

               (?<!^).(?<!$)
              

              מבין את הסוגריים הראשונים שבודקים אם יש תחילת מחרוזת לפני התו, אבל הסגוריים השניים מחפשים סוף מחרוזת לפני התו??

              המון תודה!!

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

                שאלה נוספת
                אפשר בחיפוש אחד לחפש תווים מסוימים בלי התניה ותווים אחרים עם התנית לא ראשונים או אחרונים?

                עריכה: כך

                'dababacdbababc'.replace(/(cd|(?<!^)a(?<!$))/g, '')
                

                לא טוב לי, אני רוצה שאת a יחפש אחרי שהוא מוחק את cd
                כלומר שבכזה מקרה ה-a לפני האחרון לא ימחק כיון ש-c עתיד להימחק.

                'dababacdbababac'.replace(/(cd|(?<!^)a(?<!$))/g, '')
                

                גם א"ז אפשר להכליל לחיפוש אחד?

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

                  מידי הרבה שאלות...

                  .+(.).+
                  [^$].[^^]
                  

                  את הפקודה אני די מבין, חפש כל תו שיש לפניו ולאחריו תו (+ = לפחות מופע אחד, . = כל תו)
                  לא מבין אבל 1) מדוע 'ababacbabab'.replace((.+)(a)(.+)/g, '$1') לא תקין 2) מדוע באמצע יש גם נקודה (= כל תו) 3) על איזה פונקצית איתור כתבת שכן עובד?

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

                  2. לא הבנתי מה השאלה. אני לא ידעתי איזה תו אתה רוצה, שמתי נקודה למצוא איזה שלא יהיה.

                  3. למשל

                    var valid = /.+@.+/.test(userInput)

                  זה מוודא לך שיש לפחות שטרודל אחד באמצע המחרוזת. וזה אומר שזה כתובת anydesk תקפה 🙂


                  לגבי השורה השניה, 1) קודם כל הסדר נראה לי הפוך, סימון $ אומר סוף המחרוזת, מדוע פה הוא בתחילת החיפוש? 2) מדוע הפונקציה הזו 'ababacbabab'.replace([^$].[^^]/g, '') מוציאה שגיאה?

                  1. אכן... ט.ל.ח.
                  2. כי חסר בה לוכסן פותח.

                  לגבי חלק תוים עם התנייה וחלק לא, אני לא מרוכז כעת. אולי מחר אבדוק את זה, לילה טוב!

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

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

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

                    מדוע

                    'adcdefghijk'.match(/[^^][a-z]+[^$]/g)
                    

                    מחזיר את כל המחרוזת ולא למעט תו ראשון ואחרון?

                    מדוע

                    'ababacbabab'.replace(/[^^]a[^$]/g, '')
                    

                    מוחק הכל למעט את 2 התווים האחרונים והראשונים?

                    לגבי חלק תוים עם התנייה וחלק לא, אני לא מרוכז כעת. אולי מחר אבדוק את זה, לילה טוב!

                    אשמח!

                    כמה דברים ששמתי לב
                    היתה עוד טעות בתחביר

                    'adcdefghijk'.match(/(?<!^)[a-z]+(?<!$)/g)
                    

                    הזוית השניה מיותרת, צ"ל

                    'adcdefghijk'.match(/(?<!^)[a-z]+(?!$)/g)
                    

                    אמנם זה הביא אותה תוצאה, אבל הוא לא 'מצא' את התו האחרון בפני שהתו הזה עם תנאי "אין לפניו סוף מחרוזת"..

                    אבל מחיקת ה-< בהתניה לפני התו, התנאי לא יחול על התו שלפני אלא על החיפוש

                    `
                    hello
                    ignoreme
                    hello123
                    ignoreme2
                    `.match(/^(?!ignoreme|ignoreme2|ignoremeN)([a-z0-9]+)$/gm)
                    // ["hello", "hello123"]
                    

                    אבל אני לא מבין

                    'abcd'.match(/!(?!abcd)[a-z]+$/g) \\ null - מובן
                    'abcg'.match(/!(?!abcd)[a-z]+$/g) \\ \\ null - מדוע, הלא התוצאה לא שווה לשלילה?
                    
                    תגובה 1 תגובה אחרונה
                    0
                    • dovidD מחובר
                      dovidD מחובר
                      dovid ניהול
                      כתב ב נערך לאחרונה על ידי
                      #12

                      מדוע א. כי מה שכתבתי [^$] זה פשוט שטויות: https://stackoverflow.com/a/15669590/1271037, זה מפורש ליטרלית כתו דולר ולא כסוף שורה וכן ^. מעניין - היה לי תחושה שבדקתי אבל כנראה זו טעות. למה זה ככה? לא יודע.

                      מדוע ב. מאותו טעם...

                      זוית מיותרת: נכון! ...

                      לא מבין: אתה המצאת את ה!, אין כזה מושג בREGEX.

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

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

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

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

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

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