рони,
ахах, хорошо, не буду больше присылать картинки, раз Вам это не нравится) Думал так понятнее для отображения ожидаемого результата) Пример: исходная строка главный врач 12345 главный сан врач искомые совпадения гл вр главный врач 12345 главный сан врач Вот пример с картинки) Такое не сработает на данный момент если добавить слово между "главный" и "врач" |
Adrikks,
картинка это замечательно пусть будет, но для проверки необходим текст. |
рони,
Понял) В общем суть в том, что должны выделяться последовательности искомых подстрок вне зависимости от кол-ва символов между ними Был бы очень благодарен, если бы подсказали как это можно сделать |
Adrikks,
нужен алгоритм. :) пока не знаю короткой дороги. |
поиск совпадений в последовательности слов
Adrikks,
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <style> label { display: flex; flex-direction: column; } #result mark { color: #FF0000; } </style> </head> <body> <label> Исходная строка: <input id="text" placeholder="Введите текст..." value="главный врач 12345 главный сан врач"> </label> <label> Искомые совпадения: <input id="search" placeholder="Введите текст..." value="гл вр"> </label> <p id="result"></p> <script> RegExp.escape = s => s.replace(/[[\\^$.|?*+()]/gim, "\\$&"); function mark(string) { const node = document.createElement("mark"); node.textContent = string; return node; } search.addEventListener("input", () => { const value = text.value.match(/\s+|\S+/g); let parts = search.value.trim(); const length = parts.length; if(!value || !length) {result.textContent = text.value; return}; parts = parts.split(/\s+/).map(pattern => new RegExp("(\\S*?)(" +RegExp.escape(pattern) +")(\\S*)", "i")); result.textContent = ""; let temp = []; for (let i = 0; i < value.length; ) { let k = i, arrFindIndex = []; let found = parts.every(reg => { let index = value.slice(k).findIndex(el => reg.test(el)); if(index === -1 ) return false; k += index; arrFindIndex.push({k,reg}); k++; return true }); if(found) {i = k; temp.push(...arrFindIndex)} else i++; } value.forEach((el, i) => { const find = temp.find(({k}) => k == i); if(find){ const {reg} = find; [_, ...el]= el.match(reg); el[1] = mark(el[1]) result.append( ...el ) } else result.append(el) }) }); search.dispatchEvent(new Event("input")); </script> </body> </html> |
рони,
последовательность из двух символов находится везде, а из одного допустим, только один раз Пример как должно: Исходный текст: АЛИЕВА БАЙНАТ АБДУРАХМАНОВНА Искомые совпадения: а б Результат: АЛИЕВА БАЙНАТ АБДУРАХМАНОВНА |
Цитата:
|
рони,
Я понимаю) Я не знаю как вам объяснить всё это в одном алгоритме По этому и кидал картинку |
Adrikks,
Цитата:
должно быть так <p id="result"><mark>А</mark>ЛИЕВА <mark>Б</mark><mark>А</mark>ЙНАТ А<mark>Б</mark>ДУРАХМАНОВНА</p> |
рони,
Я вам показал, как по заданному мне заданию) Ну хотя бы с вариантом представленным у вас, помогите пожалуйста) Больше не побеспокою Вас |
Часовой пояс GMT +3, время: 01:00. |