Я использую следующий макрос для выручения меня с NSRect:
#define LogRect(RECT) NSLog(@"%s: (%0.0f, %0.0f) %0.0f x %0.0f",
#RECT, RECT.origin.x, RECT.origin.y, RECT.size.width, RECT.size.height)
Вы могли сделать что-то подобное для CGPoint:
@define LogCGPoint(POINT) NSLog(@"%s: (%0.0f, %0.0f)",
#POINT POINT.x, POINT.y);
Используя его следующим образом:
LogCGPoint(cgPoint);
произвел бы следующее:
cgPoint: (100, 200)
То, что у вас есть, будет работать, пока вы сначала экранируете символы регулярного выражения в своем шаблоне. Ниже приведен один пример из блога Саймона Уиллисона :
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;
Если вы хотите использовать регулярное выражение, вы может заключать каждый символ строки в квадратные скобки. Тогда у вас будет всего несколько символов для экранирования.
Но лучшим вариантом может быть усечение целевых строк, чтобы длина соответствовала вашей строке поиска, и проверка на равенство.
Вот функция, которую я использую, на основе PHP-функции preg_quote :
function regex_quote(str) {
return str.replace(new RegExp("([\\.\\\\\\+\\*\\?\\[\\^\\]\\$\\(\\)\\{\\}\\=\\!\\<\\>\\|\\:\\-])", "g"), "\\$1");
}
Итак, ваша строка теперь будет:
var match = new RegEx(regex_quote(likeExpr).replace("%", ".*").replace("_", ".")).exec(str) != null;