#javascript #regex
#javascript #регулярное выражение
Вопрос:
Я использую некоторый jquery для выделения результатов поиска. По какой-то причине, если я ввожу базовую точку, выделяется весь текст. Я использую regex и replace, чтобы обернуть результаты в тег, чтобы придать найденным совпадениям цвет.
код, который я использую
var pattern = new.RegExp('(' $.unique(text.split(" ")).join("|") ")","gi");
как я могу предотвратить выделение точкой всего текста, поэтому я хочу исключить точку из кода (точка не имеет мощности)
Комментарии:
1. Это не проблема, именно так работает регулярное выражение. Я не могу не сказать — RTFM!
2. В регулярном выражении a
.
соответствует чему угодно. Похоже, вы вообще не хотите, чтобы исходный текст обрабатывался как шаблон, и в этом случае вам нужно избегать любых специальных символов regexp в тексте.3. хорошо, хорошо, если вы понимаете регулярное выражение, я бы прочитал руководство, но я не могу найти что-либо об этом в Интернете, поэтому я спросил об этом здесь 😉
4. итак, вы говорите, что это нормально, что точка выделяет весь текст?
5. В запросе здесь нет ничего плохого, но в Интернете есть масса хороших ресурсов для регулярных выражений. Вот одно руководство, на которое я ссылался , когда впервые изучал его.
Ответ №1:
Возможно, вы сможете достичь этого, выполнив это:
var pattern = new.RegExp('(' $.unique(text.replace('.', '\.').split(" ")).join("|") ")","gi");
Идея здесь в том, что вы пытаетесь избежать точки, которая действует как символ подстановки в регулярном выражении.
Комментарии:
1. ага, хорошо, это работает, не думал, что это так просто 😉 спасибо
2. Я думаю, вы могли бы вместо этого использовать
.replace(/./g, '\.')
. Я полагаю, что ваш метод заменит только первое совпадение.3. да, вы правы, ввод большего количества точек все равно выделит некоторый текст, спасибо, Брайан, это работает идеально
Ответ №2:
Это заменит все специальные символы RegExp (за исключением |
, поскольку вы используете их для объединения терминов) на их экранированную версию, чтобы вы не получили нежелательных совпадений или синтаксических ошибок:
var str = $.unique(text.split(" ")).join("|"),
pattern;
str = str.replace(/[\. *?^$[](){}/'#:!=]/ig, "\$amp;");
pattern = new RegExp('(' str ')', 'gi');
Ответ №3:
Предполагается, что точка соответствует всему тексту (на самом деле, почти всему). Если вы хотите сопоставить точку, вы можете просто экранировать ее как .
.
Ответ №4:
Если у вас есть точка в вашем регулярном выражении, она должна соответствовать любому символу, кроме символов новой строки. Если вам не нужна эта функциональность, вам нужно избежать точки.
Пример регулярного выражения с экранированной точкой /word./
Ответ №5:
Вам нужно экранировать текст, который вы вводите в регулярное выражение, чтобы специальные символы не имели нежелательных значений. Мой код основан на некоторых изphpjs.org:
var words = $.unique(text.split(" ")).join("|");
words = words.replace(/[.\ *?[^]$(){}=!<>|:\-]/h, '\$amp;'); // escape regex special chars
var pattern = new RegExp('(' words ")","gi");
При этом следующие символы экранируются: . *?[^]$(){}=!<>|:-
с обратной косой чертой
, чтобы вы могли безопасно вставлять их в свою new RegExp
конструкцию.