Перейти к основному содержимому

Генератор symbol

Когда брать. Нужна строка заданной длины из конкретного набора символов — токен, купонный код, случайный суффикс, «шум» на нужной письменности. symbol берёт по одному символу из набора, который вы задаёте. (Для целого слова из списка вместо этого используйте text.)

Набор символов задаётся одним из двух способов — но никогда обоими сразу:

  • value — перечислить свой набор прямо здесь;
  • alphabet — назвать встроенный Unicode-алфавит.

Затем length задаёт, сколько символов выдать, а include / exclude подстраивают набор, не переписывая его целиком.

Примеры вывода на этой странице иллюстративны — конкретные символы зависят от сида и могут отличаться между версиями ядра. Стабильны сами правила, которые эти примеры демонстрируют.

Коротко

АтрибутОбязательныйЧто делает
valueодин из двухСвой набор символов (литералы + диапазоны [x-y])
alphabetодин из двухИмя встроенного Unicode-алфавита
lengthнетДлина строки; по умолчанию 1, максимум 1024
includeнетДобавить символы к набору (та же грамматика, что и value)
excludeнетУбрать символы из набора

Свой набор через value

Самый простой путь: перечисляете нужные символы в value. Регулярные выражения не нужны — вы пишете набор, а symbol тянет из него.

<gen type="symbol" value="ABCDEF" length="4"/> <!-- литералы -->
<gen type="symbol" value="[a-z]" length="6"/> <!-- диапазон -->
<gen type="symbol" value="[A-Z0-9]" length="8"/> <!-- два диапазона в одной группе -->
<gen type="symbol" value="[a-f]xY[0-9]" length="5"/> <!-- диапазоны + литералы вместе -->
./run demo.tdc
value="ABCDEF" length="4"       → CDFA
value="[a-z]" length="6"        → tqmboa
value="[A-Z0-9]" length="8"     → K7QW2ZP4
value="[a-f]xY[0-9]" length="5" → x3bYa

Правила набора

  • Литералы — просто пишете символы: value="ABCDEF" → набор {A, B, C, D, E, F}.
  • Диапазоны — в квадратных скобках: [a-z], [A-Z], [0-9]. В одной группе можно смешивать несколько диапазонов: [a-z0-9_].
  • Запятые и пробелы вне скобок игнорируются — они нужны только для читаемости: value="[a-f], [0-5]" — тот же набор, что value="[a-f][0-5]". Чтобы взять запятую или пробел как символ, положите их в скобки: [,], [ ].
  • Дубликаты убираются, порядок сохраняется. value="AABB" — это просто {A, B}.

Работают любые символы любого языка — ASCII не ограничивает. Ниже раздел «Именованные алфавиты» — ярлык для целых письменностей, а «Unicode-письменности вручную» — если хотите набрать их напрямую.

Символ, а не слово

symbol берёт по одному символу. Чтобы выбрать целое слово из списка, используйте text: <gen type="text" value="red,green,blue"/>.

Длина

length задаёт, сколько символов выдать. По умолчанию 1, максимум 1024. Пригодится, когда нужен токен фиксированной ширины — 6-значный код, ключ на 32 символа и так далее.

<gen type="symbol" value="[A-Z0-9]"/> <!-- length опущен → 1 -->
<gen type="symbol" value="[A-Z0-9]" length="6"/>
<gen type="symbol" value="[A-Z0-9]" length="16"/>
./run demo.tdc
length опущен  → K
length="6"     → Q7ZW2P
length="16"    → K7QW2ZP4M9RXB3TA

Здесь поддерживается только точная длина. Если нужна строка переменной длины, диапазоны и группы длины принимает number — у symbol их нет.

Расширить набор через include

Чтобы не переписывать весь набор ради пары символов, передайте их в include. Он использует ту же грамматику, что и value (литералы и диапазоны [x-y]). Особенно полезно с именованным алфавитом, который иначе жёстко фиксирован — например, буквы плюс цифры для логин-подобной строки.

<!-- свои буквы плюс две конкретные цифры -->
<gen type="symbol" value="[a-z]" include="2,4" length="8"/>

<!-- готовый алфавит, расширенный недостающими цифрами -->
<gen type="symbol" alphabet="latin.lower" include="[0-9]" length="8"/>
./run demo.tdc
value="[a-z]" include="2,4" length="8" → t2qm4boa
alphabet="latin.lower" include="[0-9]" → k7qw2zp4

Подрезать набор через exclude

Зеркальный случай: exclude убирает символы из набора. Удобно, чтобы выкинуть из кода похожие символы (никаких O/0, никаких l/1) или срезать пару букв из именованного алфавита.

<!-- буквы и цифры без путающих пар -->
<gen type="symbol" value="[A-Z0-9]" exclude="O0Il1" length="8"/>

<!-- буквы без одной -->
<gen type="symbol" value="[a-z]" exclude="y" length="8"/>
./run demo.tdc
value="[A-Z0-9]" exclude="O0Il1" length="8" → K7QW2ZP4
value="[a-z]" exclude="y" length="8"        → tqmboade

Как include и exclude сочетаются

Итоговый набор — это (база ∪ include) − exclude, поэтому последнее слово за exclude: символ, который одновременно добавлен через include и убран через exclude, в результате не появится. Если после модификаторов набор оказывается пустым — это ошибка TDC099.

<!-- 4 добавлена, затем убрана → она проигрывает; 2 остаётся -->
<gen type="symbol" value="[a-z]" include="2,4" exclude="4" length="8"/>
./run demo.tdc
value="[a-z]" include="2,4" exclude="4" → t2qmboad   (4 нет нигде)

Именованные алфавиты через alphabet

Когда брать. Нужна случайная строка из конкретной письменности — кириллица для русских логинов, кана для японских тестовых данных, арабские или ивритские буквы для проверки RTL-вёрстки. Писать диапазон Unicode вручную ([а-я]) легко с ошибкой: забудете ё или промахнётесь мимо границы. Именованный алфавит проверяется по имени и содержит ровно нужные символы.

alphabet заменяет value — вы даёте имя из реестра плюс length.

<gen type="symbol" alphabet="cyrillic.ru.letters" length="10"/>
<gen type="symbol" alphabet="kana.hiragana" length="8"/>
<gen type="symbol" alphabet="arabic.letters" length="6"/>
./run demo.tdc
cyrillic.ru.letters length="10" → рнБСпВЖЧжХ
kana.hiragana length="8"        → ゃまぃすめいおち
arabic.letters length="6"       → فؿآحـآ

Это намеренная демонстрация Unicode/локализации: вывод не латинский специально — чтобы показать, что один и тот же генератор выдаёт любую названную письменность.

Живые примеры письменностей

Один и тот же генератор, по одной строке на алфавит (length="10") — чтобы сравнить письменности рядом:

alphabetПример вывода
latin.lowerusahtbcjpi
latin.upperUSAHTBCJPI
digits.fullwidth7702701363
cyrillic.ru.lettersрнБСпВЖЧжХ
greek.lettersξμΒΟνΓΖΤζΡ
hebrew.lettersפףאחפבגךני
arabic.lettersفؿآحـآإذغد
kana.hiraganaゃまぃすめいおちふそ
kana.katakanaユメィズヤイオヂヘタ
cjk.unified.basic货袪倱料護冣囱沌耣楿
roman.upperDDIXDIIXCX

Все поддерживаемые имена

alphabetЧто содержит
latin.lowerASCII a-z
latin.upperASCII A-Z
latin.lettersASCII A-Z и a-z
digits.asciiASCII-цифры 0-9
digits.fullwidthПолноширинные цифры 0-9
cyrillic.ru.lowerРусская кириллица а-я плюс ё
cyrillic.ru.upperРусская кириллица А-Я плюс Ё
cyrillic.ru.lettersРусская кириллица в обоих регистрах, включая ё
greek.lettersБазовые греческие буквы
hebrew.lettersИврит א-ת
arabic.lettersАрабские буквы ء-ي
kana.hiraganaЯпонская хирагана ぁ-ゖ
kana.katakanaЯпонская катакана ァ-ヺ
cjk.unified.basicCJK Unified Ideographs U+4E00..U+9FFF
roman.upperСимволы римских чисел I V X L C D M
roman.lowerСимволы римских чисел i v x l c d m

Все 16 имён проверены: каждое резолвится и выдаёт символы своей письменности. Набор фиксирован, поэтому подстраивайте его через include / exclude — например alphabet="cyrillic.ru.letters" exclude="ъь".

Unicode-письменности вручную

Именованный алфавит использовать не обязательно: раз value принимает любые символы, письменность (или смесь нескольких) можно набрать напрямую. Там, где именованный алфавит есть, он всё же предпочтительнее: он документирован, валидируется и включает неудобные символы, которые простой диапазон пропустит (например, русскую ё).

<gen type="symbol" value="[А-Я]" length="4"/> <!-- кириллический диапазон -->
<gen type="symbol" value="कखगघचछ" length="3"/> <!-- литералы деванагари -->
<gen type="symbol" value="あア[0-9][A-F]" length="6"/> <!-- микс скриптов + диапазоны -->
./run demo.tdc
value="[А-Я]" length="4"          → ШФПР
value="कखगघचछ" length="3"          → चचग
value="あア[0-9][A-F]" length="6" → アB4あ7ア

Те же алфавиты в regex

Реестр алфавитов доступен и внутри regex, и внутри advanced_regex через escape \a{name} — так можно встроить именованную письменность в бо́льший паттерн:

<gen type="regex" value="\a{kana.hiragana}{5}"/>
./run demo.tdc
まぃすめい
ほゆすを
さしぃぷ

Обычные BMP-диапазоны вроде [а-я]{8} тоже работают внутри regex, но именованные алфавиты предпочтительнее по тем же причинам, что и выше: они документированы, валидируются по имени и покрывают символы, которые голый диапазон пропустит.

Смотрите также