проблема с регулярным выражением, точка выделяет весь текст

#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 конструкцию.