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

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

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

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

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

    מסתבך עם זה כבר הרבה זמן
    חיפוש מעבר קטע במיקום 1000 בערך
    לפני או אחרי, הכי קרוב
    ואם אין בכלל בסטרינג עד מקבל סוף הסטרינג.

    יש לכם רעיון לקוד פשוט בלי מליון התניות?

    תגובה 1 תגובה אחרונה
    0
    • א מנותק
      א מנותק
      אהרן
      כתב ב נערך לאחרונה על ידי אהרן
      #2
      function getClosetMatch(theString, matchSerch, goal) {
      let prevPos = -1;
          theString.replace(new RegExp(matchSerch, 'g'), function(match, currPos){
              prevPos = Math.abs(currPos - goal) < Math.abs(prevPos - goal) ? currPos : prevPos;
              return match;
          });
      	return prevPos;
      }        
      
      תגובה 1 תגובה אחרונה
      0
      • א מנותק
        א מנותק
        אהרן
        כתב ב נערך לאחרונה על ידי אהרן
        #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
                                • דף הבית
                                • קטגוריות
                                • פוסטים אחרונים
                                • משתמשים
                                • חיפוש
                                • חוקי הפורום