Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   как выделять последовательности искомых подстрок? (https://javascript.ru/forum/events/79074-kak-vydelyat-posledovatelnosti-iskomykh-podstrok.html)

Adrikks 15.12.2019 18:28

рони,
ахах, хорошо, не буду больше присылать картинки, раз Вам это не нравится)
Думал так понятнее для отображения ожидаемого результата)
Пример:
исходная строка
главный врач 12345 главный сан врач
искомые совпадения
гл вр
главный врач 12345 главный сан врач
Вот пример с картинки) Такое не сработает на данный момент если добавить слово между "главный" и "врач"

рони 15.12.2019 18:44

Adrikks,
картинка это замечательно пусть будет, но
для проверки необходим текст.

Adrikks 15.12.2019 19:26

рони,
Понял)
В общем суть в том, что должны выделяться последовательности искомых подстрок вне зависимости от кол-ва символов между ними
Был бы очень благодарен, если бы подсказали как это можно сделать

рони 15.12.2019 19:44

Adrikks,
нужен алгоритм. :) пока не знаю короткой дороги.

рони 15.12.2019 22:09

поиск совпадений в последовательности слов
 
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 16.12.2019 08:32

рони,
последовательность из двух символов находится везде, а из одного допустим, только один раз
Пример как должно:
Исходный текст:
АЛИЕВА БАЙНАТ АБДУРАХМАНОВНА
Искомые совпадения:
а б
Результат:
АЛИЕВА БАЙНАТ АБДУРАХМАНОВНА

рони 16.12.2019 08:42

Цитата:

Сообщение от Adrikks
последовательность из двух символов находится везде, а из одного допустим, только один раз

я пас. вы третий раз изменили условия.

Adrikks 16.12.2019 11:38

рони,
Я понимаю) Я не знаю как вам объяснить всё это в одном алгоритме
По этому и кидал картинку

рони 16.12.2019 15:45

Adrikks,
Цитата:

Сообщение от Adrikks
Исходный текст:
АЛИЕВА БАЙНАТ АБДУРАХМАНОВНА
Искомые совпадения:
а б
Результат:
АЛИЕВА БАЙНАТ АБДУРАХМАНОВНА

результат вашего выделения неверный!!!
должно быть так
<p id="result"><mark>А</mark>ЛИЕВА <mark>Б</mark><mark>А</mark>ЙНАТ А<mark>Б</mark>ДУРАХМАНОВНА</p>

Adrikks 16.12.2019 16:12

рони,
Я вам показал, как по заданному мне заданию)
Ну хотя бы с вариантом представленным у вас, помогите пожалуйста)
Больше не побеспокою Вас


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