Emulating SQL LIKE in JavaScript

后端 未结 9 1925
有刺的猬
有刺的猬 2020-11-30 05:56

How can I emulate the SQL keyword LIKE in JavaScript?

For those of you who don\'t know what LIKE is, it\'s a very simple regex which only s

9条回答
  •  南方客
    南方客 (楼主)
    2020-11-30 06:55

    An old question but there are actually no good answers here. TSQL LIKE expressions can contain square-bracket escaped sections that are already almost valid regular expressions and allow for matching % and _. E.g.:

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

    Here's my function to convert a LIKE expression into a RegExp. The input is split into square-bracket and non-square-bracket sections. The square-bracket sections just need backslash escaping and the non-square-bracket sections are fully escaped while the % and _ directives are converted to regular expressions.

    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');
    

提交回复
热议问题