@aynur_safin

JS/RegExp: Как найти вхождения подстрок с русскими символами в начале слов?

Нужно отфильтровать массив по всем вхождениям подстрок запроса
Например,
строки (str[]):
"Превед веселый медвед"
"Медведь, тебе привет"

запрос (query): "Пр мед".

Так работает, но ищет не только по началу слов.
var re = new RegExp('(?=.*' + query.split(' ').join(')(?=.*') + ')', 'i'); // (?=.*Пр)(?=.*мед)
var result = re.exec(str);


а так работает только с латиницей:
var re = new RegExp('(?=.*\\b' + query.split(' ').join('.*)(?=.*\\b') + '.*)', 'i'); // (?=.*\bПр)(?=.*\bмед)
var result = re.exec(str);


Как починить работу с русскими словами?
  • Вопрос задан
  • 1017 просмотров
Решения вопроса 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
Регулярные выражения в JavaScript немного ущербны в отношении не-латинских символов. Так, граница слова \b посчитает любой кириллический символ не-принадлежащим к слову.

Поэтому \b надо заменить на "начало строки или пробельный символ, после которого идёт искомые буквы": (?:^|\\s)

Работающий вариант:
function findMatches( input, query) {
	query = query.split(/\s+/);
	var i, parts = [];
	for(i in query) {
		parts.push( '(?=.*(?:^|\\s)' + query[i] + ')');
	}
	
	var re = new RegExp('^' + parts.join(''), 'iug');
	
	var matches = [];
	for(i in str) {
		if( re.test( str[i])) matches.push( str[i]);
	}

	return matches;
}

var str = [
"Превед веселый медвед"
,"Медведь, тебе привет"
,"ревед веселый едвед"
,"тебе привет"
];

var query = 'Пр мед';

var result = findMatches( str, query); // ["Превед веселый медвед","Медведь, тебе привет"]
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы