Javascript Regex: смелые иголки в стоге сена - PullRequest
0 голосов
/ 08 августа 2009

Это слегка измененная версия вопроса здесь . Разница в том, что я не использую специальные символы в тегах, выделенных жирным шрифтом, если они находятся спереди или сзади.

Учитывая иголку и стог сена ... Я хочу поставить жирные метки вокруг иглы. Так какое выражение регулярного выражения я бы использовал с replace ()? Я хочу, чтобы ПРОБЕЛ был разделителем, а поиск не чувствителен к регистру, и я хочу, чтобы специальные символы (такие как @! #. ()) Игнорировались при поиске

так сказать, игла "корова" и стог сена

cows, at www.cows.com, milk some COWS!

превратится в

<b>cows</b>, at www.cows.com, milk some <b>COWS</b>!

также ключевые слова должны иметь пробелы, поэтому, если ключевое слово "who is mgmt" ...

great band. who. is. mgmt btw?

превратится в

great band. <b>who. is. mgmt</b> btw?

Обратите внимание на точки выше

Я получил это в настоящее время:

function updateHaystack(input, needle) {
    return input.replace(new RegExp('(^|\\s)(' + needle + ')(\\s|$)','ig'), '$1<b>$2</b>$3');
}

к сожалению, он не выделяет слова, объединенные специальным символом ... например. ! корова не превращается в !<b>cow</b>

Ответы [ 3 ]

0 голосов
/ 08 августа 2009

Возможно, регулярные выражения - это не то, что вам нужно. Если вы ищете сопоставление с образцом, когда сами шаблоны («корова») сами по себе не являются регулярными выражениями, попробуйте использовать алгоритм сопоставления с образцом.

Вы можете использовать KMP (Knuth-Moriss-Pratt , если у вас есть только один шаблон для поиска ( пример реализации curtusy of Google) или AC (Aho-Corasick) если у вас есть несколько шаблонов для одновременного поиска и вы хотите быть чрезвычайно эффективными (в противном случае вы можете просто запустить KMP несколько раз).

0 голосов
/ 09 августа 2009

Вот мое решение:

function boldNeedle(needle, haystack) {
    var regex = RegExp("\\b(" + needle.replace(/[-[\]{}()*+?.\\^$|,#\s]/g, "\\$&") + ")\\b", "gi");
    return haystack.replace(regex, "<strong>$1</strong>");
};

boldNeedle("foo", "blah blah FOO blah foo blah")
===
"blah blah <strong>FOO</strong> blah <strong>foo</strong> blah"

Редактировать : Я должен объяснить, чем это отличается от другого решения: он выходит из иглы, поэтому ни одна его часть не рассматривается как регулярное выражение.

0 голосов
/ 08 августа 2009

Просто создайте класс, содержащий ваши специальные символы, до и после needle:

function updateHaystack(input, needle) {
  var re = new RegExp('(^|\\s|[!@#,])(' + needle + ')([!@#,]|\\s|$)','ig');
  return input.replace(re, '$1<b>$2</b>$3');
}

Заметьте, однако, что если вы добавите точку (.) в этот список, вы в конечном итоге найдете такие вещи, как "www.cows.com". Если вы не хотите, чтобы это произошло, вам следует сузить свой вопрос.

Кроме того, вы должны экранировать needle, если он содержит символы, имеющие значение в RegExp, такие как точка (.) или звездочка (*).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...