在JavaScript中模拟SQL LIKE

eri*_*len 9 javascript regex sql sql-like

如何LIKE在JavaScript中模拟SQL关键字?

对于那些不知道是什么的人LIKE来说,它是一个非常简单的正则表达式,它只支持通配符%,它匹配0个或更多字符,并且_只匹配一个字符.

但是,它不仅可以做以下事情:

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

...因为图案可能包含点,星星和任何其他特殊的正则表达式字符.

Chr*_*tal 10

只要您第一次逃避模式中的正则表达式字符,您所拥有的就会起作用.以下是Simon Willison博客的一个例子:

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');
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以将代码实现为:

likeExpr = RegExp.escape(likeExpr);
var match = new RegEx(likeExpr.replace("%", ".*").replace("_", ".")).exec(str) != null;
Run Code Online (Sandbox Code Playgroud)

  • 假设你已经有了 - RegExp.like = function(text){return new RegExp("^"+(RegExp.escape(text).replace(/%/ g,".*").replace(/ _/g,"."))+"$"); 对他来说可能有点可重复使用. (2认同)

Ste*_*las 6

我一直在寻找同样问题的答案,并在阅读了基普的回复后想到了这个:

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);
}
Run Code Online (Sandbox Code Playgroud)

然后您可以按如下方式使用它(请注意,它忽略大写/小写):

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

注 2013 年 11 月 29 日:RegExp.test()根据下面的 Lucios 评论更新了性能改进。