Страницы: 1
RSS
Регулярные выражения в PQ
 
Для добавления возможности работать с регулярными выражениями в PQ использовал статью https://www.planetaexcel.ru/techniques/7/13310/.
Хотел дополнительно реализовать удаление дубликатов внутри функции JS через конструкцию new Set
Код
var arr = [...new Set(x.match(pattern))];
var result = arr.join(delim);

но PQ выдал ошибку "Expression.Error: Элементов в перечислении было недостаточно".
Решил все таки задачу с помощью самого PQ, через Text.Combine(List.Distinct(Text.Split(...
Может кто-то сталкивался с подобной задачей и все таки есть решение через JS?

И еще вопрос, опять же с JS - есть ли возможность отсортировать вывод результатов поиска по рег. выражению по группам поиска, а не по очередности вхождения в исходную строку?  
Дело  в том, что код
Код
let fx=(txt as text, regex as text, delim as text) =>
    Web.Page(
        "<script>
            var x = '" & txt & "';
            var delim = '" & delim & "';
            var pattern = /" & regex & "/gm;
            var result = x.match(pattern).join(delim);
            if (x.match(pattern)!= null) {
                document.write(result);
                } else {
                document.write(null);
                }
                
         </script>")[Data]{0}[Children]{0}[Children]{1}[Text]{0}

in
fx

выдает найденные подстроки в том порядке, в котором они находятся в подстроке, а нужно что бы согласно условиям поиска, разделенных | в рег. выражении.
Изменено: Иван Ган - 10.03.2025 17:18:19
 
Код
let fx = (txt as text, regex as text, delim as text) =>
    Web.Page(
        "<script>
            var x = '" & txt & "';
            var delim = '" & delim & "';
            var pattern = new RegExp('" & regex & "', 'gm');
            var results = Array.from(x.matchAll(pattern));
            
            // Сортировка по группам
            results.sort((a, b) => {
                if (a[1] === b[1]) return 0;
                if (a[1] < b[1]) return -1;
                return 1;
            });
            
            // Вывод отсортированных результатов
            var sortedResult = results.map(match => match[1]).join(delim);
            document.write(sortedResult);
        </script>")[Data]{0}[Children]{0}[Children]{1}[Text]{0}

В этом примере предполагается, что группа, по которой вы хотите сортировать, является первой группой (a[1]). Если у вас несколько групп или они имеют другие индексы, то скорректируйте код сортировки соответственно.

Можно ещё попробовать поиграться с именованными группами - так будет несколько легче:
Код
let fx = (txt as text, regex as text, delim as text) =>
    Web.Page(
        "<script>
            var x = '" & txt & "';
            var delim = '" & delim & "';
            // Используем именованную группу в регулярном выражении
            var pattern = new RegExp('(?<fruit>" & regex & ")', 'gm');
            
            var results = Array.from(x.matchAll(pattern));
            
            // Сортировка по именованной группе
            results.sort((a, b) => {
                if (a.groups.fruit === b.groups.fruit) return 0;
                if (a.groups.fruit < b.groups.fruit) return -1;
                return 1;
            });
            
            // Вывод отсортированных результатов
            var sortedResult = results.map(match => match.groups.fruit).join(delim);
            document.write(sortedResult);
        </script>")[Data]{0}[Children]{0}[Children]{1}[Text]{0}
One tap - one kill
Страницы: 1
Читают тему
Наверх