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

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

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

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

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

    תודה!

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

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

      זה טוב?

      .+(.).+
      

      וזה?

      [^$].[^^]
      

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

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

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