Для добавления возможности работать с регулярными выражениями в 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
выдает найденные подстроки в том порядке, в котором они находятся в подстроке, а нужно что бы согласно условиям поиска, разделенных | в рег. выражении.
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}