Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Поиск и замена строк с кириллическими символами (https://javascript.ru/forum/misc/7822-poisk-i-zamena-strok-s-kirillicheskimi-simvolami.html)

bibimij 20.02.2010 22:47

Поиск и замена строк с кириллическими символами
 
Подскажите, пожалуйста.
Делаю плагин autocomplete к jQuery. Не получается сделать проверку на вхождение и замену в строках с символами кириллицы.
Делаю так:
var re = new RegExp('\\b'+text,'gi');
if(str.search(re))
 str.replace(re,'<strong>$1</strong>');

где str — текст текущего элемент списка (в цикле обхожу все элементы),
text — это текст, содержащийся в поле ввода, т.е. подстрока.
С латиницей получается, с кириллицей — нет.

Нашёл примерчик регулярного выражения из готового плагина. Сработало! Объясните его, пожалуйста.
var re = new RegExp("(?![^&;]+;)(?!<[^<>]*)("+text+")(?![^<>]*>)(?![^&;]+;)",'gi');


Интересует само содержимое выражения.

vk65535 21.02.2010 01:44

У вас в выражении используется спецсимвол \b (граница слова). Реги к сожалению не знают национальных алфавитов, и совпадение всегда будет ложным (как и в случае с \w).

bibimij 21.02.2010 14:40

Хм.
Но ведь готовые autocomplete'ы правильно выделяют слова по регулярным выражениям.
Я не могу понять второго регулярного выражения, которое я нашёл в одном из таких контекстных поисков:
var re = new RegExp("(?![^&;]+;)(?!<[^<>]*)("+text+")(?![^<>]*>)(?![^&;]+;)",'gi');

На вскидку, там отсекаются теги и что

vk65535 21.02.2010 19:22

И последовательности, типа &nbsp;

bibimij 22.02.2010 00:12

Но, по документации, конструкция x(?!y) находит x, если за x не следует y.
Чем является x в первой скобке (?![^&;]+; )?

bibimij 22.02.2010 01:43

Я, кажется, составил подходящую комбинацию и она оказалась неприлично проста:
var re = new RegExp('(^| |\\()('+text+')','i');
if(str.search(re))
 str.replace(re,'$1<strong>$2</strong>');

bibimij 22.02.2010 02:25

Да, действительно, работает как надо.

Бобр 25.02.2010 09:16

Скажите, пользователь вводит слово с клавиатуры, как это слово найти и заменить в имеющемся тексте?

Проблема в том, что если пользователь введёт символ "/" или "[" или ещё какой-то, то это будет воспринято как спецсимвол регулярного выражения, а мне не нужно этого ничего. Нужно просто заменить один текст на другой. Как это можно сделать?

Riim 25.02.2010 13:19

Цитата:

Сообщение от Бобр
Проблема в том, что если пользователь введёт символ "/" или "[" или ещё какой-то, то это будет воспринято как спецсимвол регулярного выражения

Экранировать символом "\".

RegExp.escape = function(str) {
	return (str + '').replace(/([?!^$.(){}:|=[\]+\-\/\\*])/g, '\\$1');
};

Бобр 26.02.2010 04:53

Цитата:

Сообщение от Riim
RegExp.escape = function(str) {
return (str + '').replace(/([?!^$.(){}:|=[\]+\-\/\\*])/g, '\\$1');
};

А как этим воспользоваться?

Неужели в javascript нет родных функций замены без регулярных выражений? Ведь если сначала добавлять слёш, а потом обрабатывать регулярными выражениями, то скорости программе это совсем не добавляет.

B@rmaley.e><e 26.02.2010 07:04

alert('\\d+ 393475'.replace('\\d+','---'))

Бобр 05.03.2010 22:31

Это ... Как мне воспользоваться, то кодом?
Слабо я разбираюсь в javascript. Никак этот вопрос с поиском без регэкспов для себя не закрою.

bibimij 05.03.2010 22:38

Очень просто.
var escaped = RegExp.escape(str);

str — строка, которую надо обработать,
escaped — обработанная строка.

Бобр 21.03.2010 06:31

Цитата:

Сообщение от bibimij (Сообщение 46919)
Очень просто.
var escaped = RegExp.escape(str);

str — строка, которую надо обработать,
escaped — обработанная строка.

А вырезаемый текст?
var s1 = '<b>текст (1+2)*3</b>'
var s2 = 'фыва<b>текст (1+2)*3</b>олдж<b>текст (1+2)*3</b>'

Как мне из s2 вырезать s1?

На Паскале это было бы так:
result := StringReplace(s2, s1, '', [rfReplaceAll]);

А на Жаваскрипте я чувствую, что надо горы свернуть, чтобы сделать эту элементарную вещь.

Riim 21.03.2010 07:54

Цитата:

Сообщение от Бобр
А на Жаваскрипте я чувствую, что надо горы свернуть, чтобы сделать эту элементарную вещь.

думаете, попытка выставить js ущербным приведет к тому, что все кинутся доказывать обратное и в доказательство напишут все за вас? На этом форуме чаще наоборот случается. Вот вам несколько ссылок для самостоятельного изучения:
http://javascript.ru/RegExp
http://javascript.ru/String/replace
http://javascript.ru/forum/misc/3687...html#post19033

Бобр 21.03.2010 13:11

ю.

Riim 21.03.2010 13:26

Цитата:

Сообщение от Бобр
На Жаваскрипте вместо строчки кода, надо прочитать несколько длинных статей

да, js не для слабаков ;) .

Цитата:

Сообщение от Бобр
причём тот, кто их сам прочитал, дать ответа в виде строчки кода не может

я уже сказал, что просить надо нормально. На js будет так:
str = str.replace(new RegExp(RegExp.escape(str), 'g'), '');


Часовой пояс GMT +3, время: 09:15.