복붙노트

[SQL] 자바 스크립트에서 SQL LIKE 에뮬레이션

SQL

자바 스크립트에서 SQL LIKE 에뮬레이션

어떻게 자바 스크립트에서 SQL 키워드 LIKE 에뮬레이트 할 수 있습니까?

LIKE가 무엇인지 모르고있는 당신의 그것들을 위해, 그것은 정확히 하나의 문자와 일치하는 경우에만 0 개 이상의 문자와 일치하는 와일드 카드 %를 지원하고, 아주 간단한 정규식 _입니다.

그러나,이 같은 뭔가를 그냥 불가능합니다 :

var match = new RegEx(likeExpr.replace("%", ".*").replace("_", ".")).exec(str) != null;

... 패턴이 도트, 별과 다른 특수 정규식 문자를 포함 할 수 있기 때문이다.

해결법

  1. ==============================

    1.당신은 당신의 패턴으로 먼저 정규식 문자를 이스케이프만큼 작동이 무엇입니까. 다음은 사이먼 윌리 슨의 블로그에서 하나의 예입니다 :

    당신은 당신의 패턴으로 먼저 정규식 문자를 이스케이프만큼 작동이 무엇입니까. 다음은 사이먼 윌리 슨의 블로그에서 하나의 예입니다 :

    RegExp.escape = function(text) {
      if (!arguments.callee.sRE) {
        var specials = [
          '/', '.', '*', '+', '?', '|',
          '(', ')', '[', ']', '{', '}', '\\'
        ];
        arguments.callee.sRE = new RegExp(
          '(\\' + specials.join('|\\') + ')', 'g'
        );
      }
      return text.replace(arguments.callee.sRE, '\\$1');
    }
    

    그런 다음 코드로 구현할 수 :

    likeExpr = RegExp.escape(likeExpr);
    var match = new RegEx(likeExpr.replace("%", ".*").replace("_", ".")).exec(str) != null;
    
  2. ==============================

    2.나는 대답 같은 질문을 찾고 킵의 응답을 읽은 후이 함께했다되었다 :

    나는 대답 같은 질문을 찾고 킵의 응답을 읽은 후이 함께했다되었다 :

    String.prototype.like = function(search) {
        if (typeof search !== 'string' || this === null) {return false; }
        // Remove special chars
        search = search.replace(new RegExp("([\\.\\\\\\+\\*\\?\\[\\^\\]\\$\\(\\)\\{\\}\\=\\!\\<\\>\\|\\:\\-])", "g"), "\\$1");
        // Replace % and _ with equivalent regex
        search = search.replace(/%/g, '.*').replace(/_/g, '.');
        // Check matches
        return RegExp('^' + search + '$', 'gi').test(this);
    }
    

    (이 UPPER를 무시 노트 / 소문자)를 다음과 같이 다음을 사용할 수 있습니다 :

    var url = 'http://www.mydomain.com/page1.aspx';
    console.log(url.like('%mydomain.com/page_.asp%')); // true
    

    참고 29/11/2013 : 아래 Lucios의 의견에 따라 RegExp.test () 성능 향상과 함께 업데이트되었습니다.

  3. ==============================

    3.다음은 PHP의 preg_quote 기능에 따라 기능 I 사용은,이다 :

    다음은 PHP의 preg_quote 기능에 따라 기능 I 사용은,이다 :

    function regex_quote(str) {
      return str.replace(new RegExp("([\\.\\\\\\+\\*\\?\\[\\^\\]\\$\\(\\)\\{\\}\\=\\!\\<\\>\\|\\:\\-])", "g"), "\\$1");
    }
    

    그래서 당신의 라인은 지금과 같다 :

    var match = new RegEx(regex_quote(likeExpr).replace("%", ".*").replace("_", ".")).exec(str) != null;
    
  4. ==============================

    4.당신이 정규식을 사용하려는 경우, 당신은 사각 괄호 안에 문자열의 각 문자를 포장 할 수 있습니다. 그럼 당신은 탈출하는 몇 가지 문자를 가지고있다.

    당신이 정규식을 사용하려는 경우, 당신은 사각 괄호 안에 문자열의 각 문자를 포장 할 수 있습니다. 그럼 당신은 탈출하는 몇 가지 문자를 가지고있다.

    그러나 더 나은 옵션은 길이가 검색 문자열을 일치하도록 대상 문자열을 잘라와 평등을 확인 할 수 있습니다.

  5. ==============================

    5.오래된 질문하지만, 여기에 좋은 답변은 실제로 존재하지 않는다. 대괄호를 포함 할 수 TSQL LIKE 표현식은 이미 거의 유효한 정규식과 일치 % 및 _ 허용 섹션을 탈출했다. 예컨대 :

    오래된 질문하지만, 여기에 좋은 답변은 실제로 존재하지 않는다. 대괄호를 포함 할 수 TSQL LIKE 표현식은 이미 거의 유효한 정규식과 일치 % 및 _ 허용 섹션을 탈출했다. 예컨대 :

    '75%' LIKE '75[%]'
    '[foo]' LIKE '[[]foo]' -- ugh
    

    다음은 정규식에 LIKE 식을 변환하는 제 기능입니다. 입력은 대괄호 및 비 대괄호 섹션으로 분할됩니다. 사각 브래킷 부분은 탈출 백 슬래시를 필요로하고, % 및 _ 지침은 정규 표현식으로 변환하는 동안 비 대괄호 섹션은 완전히 탈출하고 있습니다.

    const likeRegExp = (expression, caseSensitive = false) =>
        new RegExp(`^${
            expression.split(/(\[.+?\])/g)
            .map((s, i) => i % 2 ?
                s.replace(/\\/g, '\\\\') :
                s.replace(/[-\/\\^$*+?.()|[\]{}%_]/g, m => {
                    switch(m) {
                        case '%': return '.*';
                        case '_': return '.';
                        default: return `\\${m}`;
                    }
                })
            ).join('')
        }$`, caseSensitive ? '' : 'i');
    
  6. ==============================

    6.크리스 반 Opstal의 대답에서 당신은 완전히 대체를 사용하는 대신에 '%'와 '_'의 모든 occurrances을 대체하기 위해 교체해야합니다. 방법을 참조 완전히 대체 할 수 있습니다 - 여기

    크리스 반 Opstal의 대답에서 당신은 완전히 대체를 사용하는 대신에 '%'와 '_'의 모든 occurrances을 대체하기 위해 교체해야합니다. 방법을 참조 완전히 대체 할 수 있습니다 - 여기

  7. ==============================

    7.조니 여기에 최근에 와서하지만 나를 위해이 작품은 내가 기본 페이지 후 결과를 보여주는 특정 페이지를 방지하기 위해 내 스파 페이지에 대한 사용 :

    조니 여기에 최근에 와서하지만 나를 위해이 작품은 내가 기본 페이지 후 결과를 보여주는 특정 페이지를 방지하기 위해 내 스파 페이지에 대한 사용 :

    function like(haystack,needle){
        needle = needle.split(','); 
        var str = haystack.toLowerCase();
        var n = -1;
        for(var i=0;i<needle.length;i++){
            n = str.search(needle[i]);
            if(n > -1){
                return n;
            }
        }
    return n;
    }
    

    사용법은 - 여기에 내가 도구, 연락처 또는 홈 페이지에 결과가 표시되지 할 - 결과를 () 내가 여기에 표시되지 않는 기능은 다음과 같습니다

    var n = like($data,'tools,contact,home');
    //~ alert(n);
    if(n < 0){// does not match anything in the above string
      results($data);
    }
    
  8. ==============================

    8.또한 핸들 \ %와 \ _를 사용하여 _ 와일드 카드 %의 탈출 것을 무언가를 원했다.

    또한 핸들 \ %와 \ _를 사용하여 _ 와일드 카드 %의 탈출 것을 무언가를 원했다.

    여기에 부정적인 lookbehind를 사용하여 내 솔루션입니다 :

    // escapes RegExp special characters
    const escapePattern = s => s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');
    
    // converts ILIKE pattern to a RegExp object
    const ilikeToRegExp = pattern =>
      new RegExp(
        `^${escapePattern(pattern)}$`
          // convert ILIKE wildcards, don't match escaped
          .replace(/(?<![\\])%/g, '.*')
          .replace(/(?<![\\])_/g, '.')
          // replace ILIKE escapes
          .replace(/\\%/g, '%')
          .replace(/\\_/g, '_'),
        'i'
      );
    

    용법:

    ilikeToRegExp('%eLlo WoR%').test('hello world')  
    // true
    
    ilikeToRegExp('ello wor').test('hello world')  
    // false
    
    ilikeToRegExp('%90\%%').test('...90%...') 
    // true
    
  9. from https://stackoverflow.com/questions/1314045/emulating-sql-like-in-javascript by cc-by-sa and MIT license