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

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

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

חיפוש מעבר קטע באזור מסוים במחרוזת

מתוזמן נעוץ נעול הועבר תכנות
15 פוסטים 3 כותבים 1.1k צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • א מנותק
    א מנותק
    אהרן
    כתב ב נערך לאחרונה על ידי אהרן
    #3
    function getClosetMatch(theString, matchSerch, goal) {
    let prevPos = -1;
        theString.replace(new RegExp(matchSerch, 'g'), function(match, currPos){
            ***currPos += match.length;***
            prevPos = Math.abs(currPos - goal) < Math.abs(prevPos - goal) ? currPos : prevPos;
            return match;
        });
    	return prevPos;
    }        
    

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

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

      אני צריך את שניהם

              function getClosetMatch(theString, matchSerch, goal) {
              let prevPos = [-1, 0];
                  theString.replace(new RegExp(matchSerch, 'g'), function(match, currPos){
                      prevPos[0] = Math.abs(currPos - goal) < Math.abs(prevPos - goal) ? currPos : prevPos;
                      currPos += match.length;
                      prevPos[1] = Math.abs(currPos - goal) < Math.abs(prevPos - goal) ? currPos : prevPos;
                      return match;
                  });
              	return prevPos;
              }
      
      תגובה 1 תגובה אחרונה
      1
      • מנצפךמ מנותק
        מנצפךמ מנותק
        מנצפך
        כתב ב נערך לאחרונה על ידי
        #5

        @אהרן אמר בחיפוש מעבר קטע באזור מסוים במחרוזת:

        getClosetMatch

        אגב, אני חושב closest. ולא closet.

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

          שכחת אינדקסרים, וקצת עיצוב הזחות (עד מתי? סה"כ קיצור מקשים!):

          function getClosetMatch(theString, matchSerch, goal) {
              let prevPos = [-1, 0];
              theString.replace(new RegExp(matchSerch, 'g'), function(match, currPos){
                  prevPos[0] = Math.abs(currPos - goal) < Math.abs(prevPos[0] - goal) ? currPos : prevPos[0];
                  currPos += match.length;
                  prevPos[1] = Math.abs(currPos - goal) < Math.abs(prevPos[1] - goal) ? currPos : prevPos[01];
                  return match;
              });
              return prevPos;
          }
          

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

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

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

            @dovid אמר בחיפוש מעבר קטע באזור מסוים במחרוזת:

            שכחת אינדקסרים

            ?

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

              @אהרן אמר בחיפוש מעבר קטע באזור מסוים במחרוזת:

              ?

              צודק!

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

                בסוף עשיתי אחרת, זה נכון יותר כיון שזה 2 צורות הסתכלות על אותו חיפוש.

                function getClosetMatch(theString, matchSerch, goal) {
                    let prevPos = [-1, 0];
                    theString.replace(new RegExp(matchSerch, 'g'), function(match, currPos){
                        prevPos[0] = Math.abs(currPos - goal) < Math.abs(prevPos[0] - goal) ? currPos : prevPos[0];
                        prevPos[1] = prevPos[0] + match.length;
                        return match;
                    });
                    return prevPos;
                }
                
                תגובה 1 תגובה אחרונה
                0
                • dovidD מנותק
                  dovidD מנותק
                  dovid ניהול
                  כתב ב נערך לאחרונה על ידי dovid
                  #10

                  אני חשבתי לייעל את זה, כי בדרך של הריפלייס על כרחך הוא עובר על כל התוצאות כולל אחרי שאתה בודאי לא צריך. שהרי אחרי התוצאה הראשונה שאינדקס ההתחלה שלה גדול מgoal כבר מיותר להמשיך.
                  לכן אני כתבתי ככה:

                  function getClosetMatch(theString, matchSerch, goal) {
                      let prevPos = [-1, 0];
                      let reg = new RegExp(matchSerch, 'g');
                      let lastResult = null;
                      while((lastResult = reg.exec(theString)) != null){
                          let currPos = reg.lastIndex;
                          if(currPos < goal)
                              prevPos = [currPos, lastResult.length];
                          else {
                              if((prevPos[0] - goal) > (goal - currPos))
                                  prevPos = [currPos, lastResult.length];
                              break;
                          }
                      }
                  
                      return  prevPos;
                  }
                  

                  זה ארוך יותר, מה שנקרא "לפרנציפ"...
                  יש פה רווח שולי שלא צריך גם את הMath.abs, שהרי ממילא בדקתי אם הוא קטן מgoal... נו נו 🙂

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

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

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

                    @dovid
                    בחישוב שלי יש בעיה נוספת
                    אם הערך ההתחלתי (-1) קרוב יותר מהמקום הראשון שמוצא, הוא בוחר ב- 1-.

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

                      למה זה לא עובד?
                      http://jsfiddle.net/pPW8Y/388/

                      עם הרפלייס הכל היה טוב
                      משהו בפונקציה exec מתנהג שונה.

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

                        לא טוב

                        var str = 'aa\r\n\bb\r\n'
                        var reg = new RegExp('\r\n|\n\r|\r|\n', 'g');
                        var res = reg.exec(str)
                        
                        res.length
                        //reg.lastIndex
                        //str.length
                        

                        זה מחזיר 1, בזמן שהוא אמור למצוא 2 תווי סוף קטע.

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

                          זה זה

                          function getClosetMatch(theString, matchSerch, goal) {
                              let prevPos = [-1, 0];
                              let reg = new RegExp(matchSerch, 'g');
                              let lastResult = null;
                              while((lastResult = reg.exec(theString)) != null){
                                  let currPosAfterFind = reg.lastIndex;
                                  let currPosBeforeFind = lastResult.index;
                                  if(currPosAfterFind < goal || prevPos[0]==-1) {
                                      prevPos = [currPosBeforeFind, currPosAfterFind];
                                  } else {
                                      if((prevPos[1] - goal) < (goal - currPosAfterFind)) {
                                          prevPos = [currPosBeforeFind, currPosAfterFind];
                                      }
                                      break;
                                  }
                              }
                          
                              return  prevPos;
                          }
                          
                          תגובה 1 תגובה אחרונה
                          0
                          • dovidD מנותק
                            dovidD מנותק
                            dovid ניהול
                            כתב ב נערך לאחרונה על ידי
                            #15

                            לגבי הקוד הראשון עליך לשנות מmatch[1] לmatch[0]

                            הסביר: הexec כל פעם מחזיר את ההופעה הראשונה אחרי הlastIndex ומעדכן את הlastIndex למיקום הרלוונטי. הוא מחזיר את ההופעה שנמצאה בצורת מערך, רק עבור הקבוצות. במקרה שלך אין קבוצות = מעניין אותך רק הקבוצה הראשונה שמכילה את כלל התוצאות.

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

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

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

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

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

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