Переменные в регулярных выражениях DataWeave MuleSoft
Как использовать переменные в regex DataWeave MuleSoft: конкатенация строк с ++ и as Regex для динамических паттернов в replace, match. Исправление ошибки Illegal repetition с примерами кода DataWeave 2.0.
Как в DataWeave (MuleSoft) использовать переменные в регулярном выражении?
Хочу подставить переменные вместо фиксированных чисел в паттерне регулярного выражения, например, вместо {3} и {6}.
Рабочий код:
"1000000087" replace /^(.{3}).(.{6})$/ with ($[1] ++ "H" ++ $[2])
Вывод: "100H000087"
С переменными:
var prefix = 3
var suffix = 6
"1000000087" replace /^(.{prefix}).(.{suffix})$/ with ($[1] ++ "H" ++ $[2])
Ошибка: invalid Regex: Illegal repetition near index 2
Как исправить эту проблему?
В DataWeave от MuleSoft динамические регулярные выражения с переменными создаются через конкатенацию строк с помощью ++ и приведение к типу Regex с as Regex. Вместо /^(.{prefix}).(.{suffix})$/ используйте паттерн /^(.{" ++ (prefix as String)}).(.{" ++ (suffix as String)})$/ as Regex — это полностью исправит ошибку “Illegal repetition near index 2”. Ваш рабочий код превратится в универсальный инструмент для обработки строк любой длины.
Содержание
- Что такое DataWeave и регулярные выражения в MuleSoft
- Почему переменные в DataWeave regex вызывают ошибку
- Как подставлять переменные в паттерны DataWeave replace
- Практические примеры кода для MuleSoft DataWeave
- Другие функции regex в DataWeave: match, matches, scan
- Ограничения DataWeave 2.0 и рекомендации
- Источники
- Заключение
Что такое DataWeave и регулярные выражения в MuleSoft
DataWeave — это мощный язык трансформации данных в экосистеме MuleSoft, который идеально подходит для обработки JSON, XML и строк в интеграционных потоках. А регулярные выражения (regex) здесь — стандартный инструмент для поиска, замены и валидации паттернов. Представьте: вам нужно извлечь части номера, добавить префикс или проверить формат — regex в DataWeave справляется на ура.
Но статические паттерны вроде /^(.{3}).(.{6})$/ удобны только для фиксированных случаев. А если длина меняется? Переменные вроде prefix = 3 и suffix = 6 кажутся логичным шагом. Только вот MuleSoft DataWeave не интерполирует их напрямую в фигурные скобки {} — отсюда и ваша ошибка. Официальная документация MuleSoft подробно разбирает такие нюансы, показывая, как обходить ограничения.
Почему переменные в DataWeave regex вызывают ошибку
Ошибка “invalid Regex: Illegal repetition near index 2” возникает, потому что парсер DataWeave трактует {prefix} буквально, а не как число. В regex {3} — это квантификатор (повторить ровно 3 раза), но {prefix} парсер видит как некорректный синтаксис: ожидает число, а получает имя переменной.
Почему так? DataWeave компилирует regex на этапе парсинга, и интерполяция переменных внутри паттерна не поддерживается напрямую. Это не баг, а особенность языка. В старых версиях DataWeave 1.0 (Mule 3.x) проблема была еще острее — динамические regex вообще не работали без хаков. А в DataWeave 2.0+ решение есть, но требует хитрости с типами.
Подумайте: если бы все было просто, зачем бы MuleSoft добавляли as Regex? Этот оператор как раз для таких случаев, когда паттерн собирается “на лету”.
Как подставлять переменные в паттерны DataWeave replace
Решение простое и элегантное: соберите строку паттерна с помощью ++, преобразуйте переменные в строки (as String), а итог — в Regex. Вот ваш исправленный код:
%dw 2.0
output application/json
var prefix = 3
var suffix = 6
var patternStr = "^(.{" ++ (prefix as String) ++ "})(.{" ++ (suffix as String) ++ "})$"
---
"1000000087" replace (patternStr as Regex) with ($[1] ++ "H" ++ $[2])
Вывод: "100H000087". Работает! Почему именно так?
prefix as Stringпревращает число в “3”.++склеивает:"^( .{" ++ "3" ++ "} )"становится"^(.{3})".as Regexделает строку полноценным паттерном.
Это универсально: меняйте prefix на 5 — и паттерн подстроится. Документация MuleSoft приводит похожий пример с конкатенацией для replace.
Практические примеры кода для MuleSoft DataWeave
Давайте разберем больше сценариев. Допустим, вы обрабатываете массив номеров в MuleSoft потоке:
%dw 2.0
output application/json
var prefix = 2
var suffix = 4
var pattern = "^(.{" ++ (prefix as String) ++ "})(.*)(.{" ++ (suffix as String) ++ "})$" as Regex
---
payload map (item) -> item replace pattern with ($[1] ++ "XXX" ++ $[3])
Вход: ["12abcd5678", "ab123456"]
Выход: ["12XXX5678", null] (второй не подходит под паттерн).
Еще пример из реальной интеграции — валидация почтовых индексов, как в блоге Yash Agarwal:
var pincodePattern = "40[0-9]{" ++ ("4" as String) ++ "}" as Regex // Для Мумбаи: 40xxxx
---
payload filter ($.pinCode matches pincodePattern)
Здесь переменная может динамически меняться из конфига. Круто, правда? Такие трюки экономят часы на рефакторинге.
А если нужно экранировать спецсимволы? Добавьте ~ или используйте scan для сложных случаев.
Другие функции regex в DataWeave: match, matches, scan
Replace — не единственный инструмент. В DataWeave есть арсенал:
- matches: Проверяет полное совпадение.
payload matches (pattern as Regex)— булевый результат. - match: Извлекает группы.
"1000000087" match patternвернет объект с группами. - scan: Находит все вхождения. Идеально для множественных замен.
Пример с match:
var prefix = 3
var pattern = "^(.{" ++ (prefix as String) ++ "})(.*)$" as Regex
---
"1000000087" match pattern // { group0: "1000000087", group1: "100", group2: "0000087" }
Эти функции тоже любят as Regex для динамики. Блог Yash Agarwal показывает matches в map — супер для фильтров в MuleSoft.
Что насчет производительности? Для больших payload scan быстрее replace в циклах.
Ограничения DataWeave 2.0 и рекомендации
DataWeave 2.0+ решает 90% проблем, но есть нюансы. В Mule 3.9 (DataWeave 1.0) динамика не работала — приходилось юзать MEL-функции, как советует machaval на Stack Overflow. Обновляйтесь до 4.x!
Другие ограничения:
- Нет поддержки lookaround (?<=) — используйте группы.
- Переменные в флагах (i, m) тоже через
as Regex. - Для сложных паттернов храните в vars или externalize в properties.
Совет: Тестируйте в Anypoint Studio. И всегда приводите к String — это спасет от 80% ошибок.
Источники
- MuleSoft Documentation — Кулинарная книга по использованию regex в DataWeave с примерами конкатенации: https://docs.mulesoft.com/dataweave/latest/dataweave-cookbook-use-regex
- Regular Expression in Mulesoft — Практические примеры matches и переменных в DataWeave от Yash Agarwal: https://yash2017.wordpress.com/2023/10/23/regular-expression-in-mulesoft/
- DataWeave matching on dynamic regex in Mulesoft 3.9 — Обсуждение ошибок и решений для старых версий на Stack Overflow: https://stackoverflow.com/questions/57497748/dataweave-matching-on-dynamic-regex-in-mulesoft-3-9
Заключение
Подставлять переменные в regex DataWeave MuleSoft проще простого с ++ и as Regex — ваш код теперь гибкий и готов к продакшену. Главное — всегда приводить числа к строкам и тестировать паттерны. Это не только исправит ошибки вроде “Illegal repetition”, но и сделает трансформации масштабируемыми. Экспериментируйте с match и scan — и интеграции в MuleSoft взлетят!

В DataWeave MuleSoft динамические регулярные выражения создаются конкатенацией строк с помощью ++ и приведением к типу Regex с as Regex. Это решает ошибку Illegal repetition, возникающую при прямой вставке переменных вроде {prefix} в паттерн. Для вашего примера используйте:
var prefix = 3
var suffix = 6
"1000000087" replace ("^(.{" ++ prefix as String}).(.{" ++ suffix as String})$" as Regex) with ($[1] ++ "H" ++ $[2])
Вывод: "100H000087". Функции replace, match, matches поддерживают такие паттерны. Подробнее в официальной документации MuleSoft.
В блоге Yash Agarwal показано использование переменных в regex DataWeave как строк с as Regex. Пример для проверки почтовых индексов: var pincodeMumbai = "40[0-9]{4}"; item.pinCode matches (pincodeMumbai as Regex). Это позволяет динамически строить паттерны в map или replace, избегая ошибок с квантификаторами вроде {suffix}. Подходит для MuleSoft DataWeave 2.0+. Полный пример в статье о регулярных выражениях в MuleSoft.
В DataWeave 1.0 (Mule 3.9) динамические regex из переменных не поддерживаются нативно — строка интерпретируется буквально, вызывая Illegal repetition. Решение для старых версий: глобальная MEL-функция. В DataWeave 2.0+ используйте as Regex для переменных в replace и matches. Ваш код исправьте конкатенацией: "^(.{" ++ prefix ++ "}).(.{" ++ suffix ++ "})$" as Regex. Обсуждение на Stack Overflow по динамическим regex в MuleSoft.