[SQL] 자바 스크립트에서 SQL LIKE 에뮬레이션
SQL자바 스크립트에서 SQL LIKE 에뮬레이션
어떻게 자바 스크립트에서 SQL 키워드 LIKE 에뮬레이트 할 수 있습니까?
LIKE가 무엇인지 모르고있는 당신의 그것들을 위해, 그것은 정확히 하나의 문자와 일치하는 경우에만 0 개 이상의 문자와 일치하는 와일드 카드 %를 지원하고, 아주 간단한 정규식 _입니다.
그러나,이 같은 뭔가를 그냥 불가능합니다 :
var match = new RegEx(likeExpr.replace("%", ".*").replace("_", ".")).exec(str) != null;
... 패턴이 도트, 별과 다른 특수 정규식 문자를 포함 할 수 있기 때문이다.
해결법
-
==============================
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.나는 대답 같은 질문을 찾고 킵의 응답을 읽은 후이 함께했다되었다 :
나는 대답 같은 질문을 찾고 킵의 응답을 읽은 후이 함께했다되었다 :
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.다음은 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.당신이 정규식을 사용하려는 경우, 당신은 사각 괄호 안에 문자열의 각 문자를 포장 할 수 있습니다. 그럼 당신은 탈출하는 몇 가지 문자를 가지고있다.
당신이 정규식을 사용하려는 경우, 당신은 사각 괄호 안에 문자열의 각 문자를 포장 할 수 있습니다. 그럼 당신은 탈출하는 몇 가지 문자를 가지고있다.
그러나 더 나은 옵션은 길이가 검색 문자열을 일치하도록 대상 문자열을 잘라와 평등을 확인 할 수 있습니다.
-
==============================
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.크리스 반 Opstal의 대답에서 당신은 완전히 대체를 사용하는 대신에 '%'와 '_'의 모든 occurrances을 대체하기 위해 교체해야합니다. 방법을 참조 완전히 대체 할 수 있습니다 - 여기
크리스 반 Opstal의 대답에서 당신은 완전히 대체를 사용하는 대신에 '%'와 '_'의 모든 occurrances을 대체하기 위해 교체해야합니다. 방법을 참조 완전히 대체 할 수 있습니다 - 여기
-
==============================
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.또한 핸들 \ %와 \ _를 사용하여 _ 와일드 카드 %의 탈출 것을 무언가를 원했다.
또한 핸들 \ %와 \ _를 사용하여 _ 와일드 카드 %의 탈출 것을 무언가를 원했다.
여기에 부정적인 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
from https://stackoverflow.com/questions/1314045/emulating-sql-like-in-javascript by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 오류 메시지 : (공급자 : 공유 메모리 공급자 오류 : 0 - 없음 파이프의 다른 끝에 프로세스가에 있습니다.) (0) | 2020.05.11 |
---|---|
[SQL] 어떻게 MS 액세스를 위해 SQL의 페이지 매김을 구현합니까? (0) | 2020.05.11 |
[SQL] 어떻게 T-SQL에서 문자열에서 확장 ASCII 문자를 제거하는 방법은 무엇입니까? (0) | 2020.05.11 |
[SQL] MySQL은 두 날짜 사이의 개월의 목록을 얻는 방법 (0) | 2020.05.11 |
[SQL] 쉼표는 SQL 쿼리로 값을 구분 (0) | 2020.05.11 |