RegexРегексы
Word boundaries, word forms, phrases, special characters, and testing.*
* This chapter demonstrates the process in SillyTavern. The same sequence also applies to JanitorAI: choose a key, write the regex and test it. Field formats differ. Quick link: Regex on JanitorAI.Границы слов, словоформы, фразы, специальные символы и проверка.*
* В этой главе процесс показан на примере SillyTavern. Та же последовательность применима и в JanitorAI: выбрать ключ, написать регекс и проверить его. Формат полей отличается. Быстрый переход: Регексы в JanitorAI.
When regex keys helpКогда полезны регекс-ключи
Plain-text keys use SillyTavern's Case-sensitive and Match Whole Words settings. An entry inherits the global values unless it overrides them, so check both settings after moving a lorebook.Обычные ключи зависят от настроек SillyTavern Учитывать регистр и Только полное совпадение. Запись использует глобальные значения, если для неё не заданы свои, поэтому после переноса лорбука обе настройки стоит проверить.
A regex defines case, boundaries and allowed word forms directly, so it does not depend on those two global matching settings.Регекс напрямую задаёт регистр, границы и допустимые словоформы, поэтому не зависит от этих двух глобальных настроек.
Regex cannot rescue the wrong keyword. It can match exactly the word phone, but it cannot make that phone relevant to an unrelated memory. Choose the word first. Write the regex second.Регекс не спасёт неверно выбранный ключ. Он может найти ровно слово телефон, но не сделает его уместным для постороннего воспоминания. Сначала выберите слово. Потом пишите регекс.
The parts of a regexЧасти регекса
/\b(?:The\s+)?Lamplighter\b/i
| PieceЧасть | MeaningЗначение |
|---|---|
/ ... / | Delimiters: these mark the value as regex in a SillyTavern key.Разделители: отмечают значение как регекс в ключе SillyTavern. |
\b | Word boundary: do not begin or end inside a larger word.Граница слова: совпадение не начинается и не заканчивается внутри более длинного слова. |
(?:The\s+)? | Optional group: accept the place name with or without The.Необязательная группа: название места совпадёт как с The, так и без него. |
Lamplighter | Literal text: the distinctive part of the proper name.Обычный текст: отличительная часть имени собственного. |
i | Case-insensitive flag: match LAMPLIGHTER, Lamplighter and lamplighter alike.Флаг без учёта регистра: одинаково совпадают LAMPLIGHTER, Lamplighter и lamplighter. |
I add /i to every SillyTavern regex key so matching does not depend on case.Я добавляю /i к каждому регекс-ключу SillyTavern, чтобы совпадения не зависели от регистра.
Regex on JanitorAIРегексы в JanitorAI
This section started while I was helping Puppy review and refine the keywords in an existing lorebook for the newly published bot Whitney, Marshall & Jay. When Puppy moved the revised lorebook into JanitorAI as-is, we suddenly noticed that the regex keys seemed to work. Until then, I had relied only on wildcards. Oops.Этот раздел появился, когда я помогала Паппи проверить и доработать ключи в уже существовавшем лорбуке для недавно опубликованного бота Whitney, Marshall & Jay. Когда обновлённый лорбук переносился в JanitorAI как есть, мы вдруг заметили, что регекс-ключи, похоже, работают. До этого я пользовалась только вайлдкартами. Упс.
ILYSM PUPPY!! very proud of your work hehe <33ПАППИ, Я ТЕБЯ ОЧЕНЬ ЛЮБЛЮ!! очень горжусь твоей работой хехе <33
The Reference page links two official beginner guides and the separate Icehellionx Script Guide by Icehellionx.На странице «Справочник» собраны два официальных руководства для начинающих и отдельный Icehellionx Script Guide от Icehellionx.
Code exampleПример кода
The Teddy example below was written for this guide using the object shape of one user-made script: Advanced Lorebook v12.1 (Regex Edition). It is an example, not JanitorAI's standard lorebook format; its header names Icehellionx as the author and Crystal Dragon as the converter.Пример с Тедди написан специально для этого руководства по структуре объекта из одного пользовательского скрипта: Advanced Lorebook v12.1 (Regex Edition). Это лишь пример, а не стандартный формат лорбуков JanitorAI; в заголовке Icehellionx указан как автор, а Crystal Dragon — как автор адаптации.
| FormatФормат | How it worksКак устроен | RegexРегексы |
|---|---|---|
| Regular lorebookОбычный лорбук | A simplified editor with fields and friendly buttons. Entries, triggers and content are filled in through the UI while JanitorAI handles the underlying structure automatically.Упрощённый редактор с полями и удобными кнопочками. Записи, триггеры и содержимое заполняются через интерфейс, а внутренняя структура собирается автоматически. | Supported. The regex is entered through the lorebook UI rather than written as a JavaScript object.Поддерживаются. Регекс вводится через интерфейс лорбука, а не оформляется как объект JavaScript. |
| Advanced ScriptAdvanced Script | Direct source-code editing. Entry objects, matching logic and output fields are written in JavaScript, allowing more control but requiring more code work.Прямое редактирование исходного кода. Объекты записей, логика совпадений и поля вывода задаются в JavaScript: возможностей больше, но работать с кодом приходится вручную. | Each Advanced Script defines its own fields. The user-made example used below has separate keywords and regex arrays.Каждый Advanced Script определяет собственные поля. В пользовательском примере ниже используются отдельные массивы keywords и regex. |
In this one example, keywords holds ordinary words and regex holds JavaScript regex strings.В этом конкретном примере keywords содержит обычные ключи, а regex — строки с регексами JavaScript.
keywords/regex: provide the direct matches that can activate the entry.keywords/regex: дают прямые совпадения, которые могут активировать запись.personality: adds text tocontext.character.personality, suited to traits and behaviour.personality: добавляет текст вcontext.character.personality; подходит для черт характера и поведения.scenario: adds text tocontext.character.scenario, suited to situational lore.scenario: добавляет текст вcontext.character.scenario; подходит для ситуативного лора.
{
keywords: ["keyring", "breakup", "separation"],
regex: [
"\\bspare\\s+keys?\\b",
"\\b(?:old|former)\\s+(?:flat|apartment)\\b",
"\\b(?:ex(?:-|\\s+)|former\\s+)girlfriend\\b",
"\\breturn(?:ed|ing)?\\s+(?:back\\s+)?(?:the\\s+)?keys?\\b",
"\\b(?:keep|keeps|kept|keeping)\\s+(?:the\\s+)?keys?\\b"
],
personality: "Teddy Rusk is Nic's former girlfriend. She still drinks at The Lamplighter, and the breakup has left an easy familiarity with tension underneath.",
scenario: "Nic still carries a spare key to Teddy's old flat. When the breakup or the key comes up, he grows guarded and redirects the conversation."
},
\bspare\s+keys?\b
Matches spare key and spare keys.\s+accepts natural spacing, whiles?makes the plural optional.Находит spare key и spare keys.\s+принимает естественный пробел, аs?делает множественное число необязательным.\b(?:old|former)\s+(?:flat|apartment)\b
Matches combinations such as old flat and former apartment. Two non-capturing groups provide natural alternatives for both parts.Находит сочетания вроде old flat и former apartment. Две незахватывающие группы дают естественные варианты для обеих частей.\b(?:ex(?:-|\s+)|former\s+)girlfriend\b
Matches ex-girlfriend, ex girlfriend, and former girlfriend without accepting unrelated text between the words.Находит ex-girlfriend, ex girlfriend и former girlfriend, не разрешая посторонний текст между словами.\breturn(?:ed|ing)?\s+(?:back\s+)?(?:the\s+)?keys?\b
Matches return key, returned the keys, and returning back the key. Explicit optional groups cover tense, back, the article, and plural.Находит return key, returned the keys и returning back the key. Явные необязательные группы учитывают время глагола, back, артикль и множественное число.\b(?:keep|keeps|kept|keeping)\s+(?:the\s+)?keys?\b
Matches the listed forms of keep followed by key or keys, with an optional the.Находит перечисленные формы keep перед key или keys с необязательным артиклем the.
Backslashes are doubled for JavaScript strings. The regex array needs neither surrounding slashes nor an i flag because this script already ignores case.В строках JavaScript обратные слэши удваиваются. Массиву regex не нужны слэши по краям и флаг i, потому что скрипт уже не учитывает регистр.
The breakup came up again matches through keywords. Nic found a spare key matches through regex. Nic closed the bar matches neither field. When the entry is applied, personality is added to the character context and scenario to the scenario context.The breakup came up again даёт совпадение через keywords. Nic found a spare key совпадает через regex. Nic closed the bar не совпадает ни с одним полем. Когда запись применяется, personality добавляется в контекст персонажа, а scenario — в контекст сценария.
This script can also read a slash-wrapped regex inside keywords, such as keywords: ["/\\bodile\\b/"]. That is an alternative to regex: ["\\bodile\\b"], not something to duplicate. I use the regex array because it is clearer and avoids the lowercasing applied to slash-wrapped values. Other JanitorAI scripts may use different formats.Этот скрипт также умеет читать регекс со слэшами внутри keywords, например keywords: ["/\\bodile\\b/"]. Это альтернатива записи regex: ["\\bodile\\b"], а не поле для дублирования того же регекса. Я использую массив regex: так понятнее и удаётся избежать приведения регекса к нижнему регистру, которое применяется в keywords. В других скриптах JanitorAI формат может отличаться.
Word boundariesГраницы слов
Without boundaries, regex searches for a sequence anywhere inside the text. /ledger/i finds ledger inside ledgers and ledgering. The regex is working correctly, but that is rarely useful for a keyword.Без границ регекс ищет последовательность символов в любом месте текста. /ledger/i находит ledger внутри ledgers и ledgering. Регекс работает правильно, но для ключа такое совпадение редко бывает полезным.
/\bledger\b/i
- ledger
- (ledger)
- ledgers
- ledgering
\b marks the edge of a word: the point where a word character meets the start, end, or a non-word character. It does not consume text, so punctuation beside the word is fine. Place the boundary directly beside the word; putting it after punctuation may not work.\b отмечает край слова: место, где символ слова встречается с началом, концом или символом, не входящим в слово. Текст при этом не захватывается, поэтому пунктуация рядом не мешает. Ставьте границу вплотную к слову: после знака препинания она может не сработать.
/\bAnn\b/i
- Ann closes the bar
- ask ANN
- annoyed
- annually
- flannel
How to write a regexКак написать регекс
InflectionsСловоформы
A useful key often needs a small set of word forms. Rather than accepting any ending, I list only the intended forms. A question mark makes the piece immediately before it optional; parentheses and a vertical bar offer explicit alternatives.Полезному ключу часто нужен небольшой набор словоформ. Вместо любого возможного окончания я перечисляю только нужные формы. Знак вопроса делает предшествующую часть необязательной; скобки и вертикальная черта дают явные альтернативы.
/\bpassports?\b/i
- passport
- passports
- passporting
- passage
/\bcoordinat(?:e|ed|ing|ion)\b/i
- coordinate
- coordinated
- coordinating
- coordination
- coordinator
- coordinates badly
The second negative case is deliberate: coordinates is not in the list. Add es if that form should trigger too. Explicit regexes make omissions visible instead of hiding them behind a wildcard.Второй отрицательный пример намеренный: формы coordinates в списке нет. Добавьте es, если она тоже должна срабатывать. В явном регексе пропуск виден, а не спрятан за подстановкой.
What \w* doesКак работает \w*
In \w*, \w means an ASCII letter, digit or underscore, while * means “zero or more.” Together they allow practically any ending after book: no ending at all, or any sequence of those characters.В \w* часть \w означает латинскую букву, цифру или нижнее подчёркивание, а * — «ноль или больше». Вместе они разрешают после book практически любое окончание: его может не быть вовсе, либо дальше может идти любая последовательность таких символов.
/\bbook\w*\b/i
- book
- books
- booking
- bookstore
- bookkeeper
- book2
- book_case
- notebook
- rebook
The word boundaries block prefixes, which is why notebook and rebook do not match. They do not restrict what follows book: \w* deliberately accepts every continuation made from word characters.Границы слова блокируют приставки, поэтому notebook и rebook не совпадают. Но они не ограничивают продолжение после book: \w* намеренно принимает любую последовательность символов слова.
Use an open continuation only when every possible continuation belongs to the same entry. Four fixed letters reduce accidental matches, but they do not make every result relevant. When the valid forms are known, list them explicitly.Используйте открытое продолжение только тогда, когда любое возможное продолжение относится к той же записи. Четыре неизменные буквы снижают риск случайных совпадений, но не делают каждый результат уместным. Если нужные формы известны, перечислите их явно.
/\bbooks?\b/i
- book
- books
- booking
- bookstore
- bookkeeper
- notebook
- rebook
Here s? makes only the final s optional. The regex therefore expresses the intended forms directly instead of accepting every word that begins with book.Здесь s? делает необязательной только конечную букву s. Поэтому регекс прямо задаёт нужные формы, а не принимает любое слово, начинающееся с book.
Short wordsКороткие слова
Exact short words are exceptions in my lorebooks. I keep one only when it has clear boundaries and points to one subject. /\bAnn\b/i qualifies as a specific NPC name.Точные короткие слова в моих лорбуках считаются исключениями. Я оставляю такое слово только с чёткими границами и одной понятной темой. /\bAnn\b/i подходит как конкретное имя NPC.
A distinctive standalone noun such as /\bsatchel\b/i remains my preference. If one word would be ambiguous or unsafe, a short pronoun-free phrase such as /\bspare\s+keys?\b/i can add the needed specificity.Предпочтительным вариантом для меня остаётся характерное отдельное существительное, например /\bsatchel\b/i. Если одно слово было бы неоднозначным или небезопасным, нужную точность может дать короткая фраза без местоимений, например /\bspare\s+keys?\b/i.
No pronoun belongs anywhere in a key. I also never use the bot's or active persona's first name or surname, including those surnames in family entries. NPC names remain valid after collision testing; the names and roles section explains the distinction.Местоимения запрещены в любой части ключа. Я также никогда не использую имя или фамилию бота либо активной персоны, в том числе их фамилии в семейных записях. Имена NPC допустимы после проверки коллизий; различие объяснено в разделе об именах и ролях.
Phrases and separatorsФразы и разделители
Phrases are exceptions in my lorebooks. Multi-word proper names stay, while other phrases appear only when one word would be ambiguous or unsafe. When a phrase is necessary, its separators need to handle natural spacing.Фразы в моих лорбуках — исключение. Составные имена собственные остаются, а другие фразы появляются только тогда, когда одного слова недостаточно для точности или безопасности. Если фраза действительно нужна, разделители должны учитывать естественные варианты пробелов.
A literal space matches one literal space. \s+ is sturdier between words: it accepts one or more whitespace characters, including doubled spaces and line breaks. For compounds that may be closed, hyphenated or spaced, [- ]? accepts all three forms.Обычный пробел совпадает с одним обычным пробелом. Между словами надёжнее \s+: он принимает один или несколько пробельных символов, включая двойные пробелы и переносы строк. Для слитных, дефисных и раздельных составных слов [- ]? принимает все три формы.
That flexibility is useful, but it also broadens the regex. Test phrase keys against ordinary chat text.Такая гибкость полезна, но делает регекс шире. Проверяйте фразовые ключи на обычном тексте чата.
/\blast\s+call\b/i
- last call
- last call
- LAST CALL
- lastcall
- last caller
/\bsign[- ]?up\b/i
- signup
- sign-up
- sign up
- signing up
- assign up
AlternationАльтернатива
Alternation places several natural alternatives inside one pair of boundaries. A non-capturing group, (?:...), suits this purpose because keyword matching only needs a yes or no; nothing needs to retrieve which branch matched.Альтернатива помещает несколько естественных слов внутрь одной пары границ. Для этой цели подходит незахватывающая группа (?:...), потому что ключу нужен лишь ответ да или нет; извлекать сработавшую ветку не требуется.
/\b(?:mother|mama|parent)\b/i
- Mother
- mama said
- a parent
- grandmother
- parental
- mammal
Matching special characters literallyКак искать специальные символы буквально
Some characters have instructions attached to them in regex. Put a backslash before one when the character itself should be matched.Некоторые символы в регексах работают как команды. Если нужно найти сам символ, поставьте перед ним обратный слэш.
| CharactersСимволы | Regex meaningЗначение в регексе | Literal formКак искать буквально |
|---|---|---|
. | Any single character except a line breakЛюбой один символ, кроме переноса строки | \. |
* + ? | Control how many times the preceding part may repeatЗадают количество повторений предыдущей части | \* \+ \? |
{m,n} | Repeat the preceding part from m to n timesПовторяет предыдущую часть от m до n раз | \{m,n\} |
[ ] | Create a character class; a hyphen inside can mark a rangeСоздают класс символов; дефис внутри может задавать диапазон | \[ \] |
( ) | Create a groupСоздают группу | \( \) |
| | Separates alternatives: this or thatРазделяет варианты: это или то | \| |
^ $ | Mark the start or end of the textОбозначают начало или конец текста | \^ \$ |
\ | Introduces a special form such as \b or \sНачинает специальную конструкцию, например \b или \s | \\ |
Literal examplesПримеры буквального поиска
These examples show only how to search for punctuation. Add suitable boundaries or surrounding context before using them as lorebook keys.Эти примеры показывают только поиск знаков препинания. Перед использованием в ключах лорбука добавьте подходящие границы или соседний контекст.
| Text to matchЧто нужно найти | RegexРегекс | WhyПочему |
|---|---|---|
Dr. Cross | /Dr\.\s+Cross/i | \. means a literal dot; \s+ accepts one or more whitespace characters.\. означает буквальную точку, а \s+ принимает один или несколько пробельных символов. |
C++ | /C\+\+/i | Both plus signs are literal instead of repetition commands.Оба плюса ищутся буквально, а не работают как команды повторения. |
(owner) | /\(owner\)/i | The parentheses are part of the text rather than a regex group.Скобки становятся частью текста, а не группой регекса. |
[VIP] | /\[VIP\]/i | The square brackets are literal rather than a character class.Квадратные скобки ищутся буквально, а не создают класс символов. |
Leaving a special character bare can either broaden the match or make the regex invalid. For example, a dot without a backslash quietly accepts almost any character, while a misplaced plus may stop the regex from compiling.Если оставить специальный символ без обратного слэша, регекс может стать слишком широким или вообще перестать компилироваться. Например, точка без обратного слэша незаметно принимает почти любой символ, а плюс в неверном месте может сломать регекс.
A slash has no special meaning to the regex engine, but SillyTavern uses slashes as the outer delimiters of a regex key. To match room/hall, write /room\/hall/i in the editor. The JSON form is covered in the next section.Для движка регексов слэш не имеет особого значения, но SillyTavern использует слэши как внешние разделители регекс-ключа. Чтобы найти room/hall, в редакторе напишите /room\/hall/i. Запись для JSON разобрана в следующем разделе.
Regex inside JSONРегексы внутри JSON
In an editor field, a word boundary is written with one backslash:В поле редактора граница слова пишется с одним обратным слэшем:
/\bAnn\b/i
In a JSON string, write every backslash twice so one reaches the regex engine:В строке JSON каждый обратный слэш записывается дважды, чтобы один дошёл до движка регексов:
"/\\bAnn\\b/i"
A single \b inside valid JSON does not mean a word boundary. JSON turns it into a backspace character before the regex engine ever sees it. The file imports, the regex looks nearly right, and the key silently fails.Одиночный \b внутри корректного JSON не означает границу слова. JSON превращает его в управляющий символ backspace ещё до того, как строку увидит движок регексов. Файл импортируется, регекс выглядит почти правильно, а ключ молча не срабатывает.
In a SillyTavern editor field, write each regex backslash once. Inside JSON, write each one twice: \b in the editor becomes \\b in JSON.В поле редактора SillyTavern каждый обратный слэш пишется один раз. В JSON каждый пишется дважды: \b в редакторе превращается в \\b в JSON.
Testing a regexПроверка регекса
A regex that compiles is only syntactically valid. It still needs to match the intended forms and reject nearby false positives. My testing has three passes.Если регекс компилируется, это доказывает лишь его синтаксическую корректность. Он ещё должен совпадать с нужными вариантами и отвергать близкие ложные совпадения. Проверка проходит в три этапа.
- Check the syntax. Use regex101 in JavaScript flavour. It tests regex behaviour, not platform fields or text processing, so retest the exact saved value in SillyTavern or the specific JanitorAI script.Проверьте синтаксис. Используйте regex101 с синтаксисом JavaScript. Он проверяет поведение регекса, но не поля и обработку текста платформой, поэтому повторно проверьте точное сохранённое значение в SillyTavern или выбранном скрипте JanitorAI.
- Test near misses. Put the desired forms beside the nearest false positives: Ann beside annoyed, Cross beside across, bar beside barbecue.Проверьте похожие слова. Поставьте нужные формы рядом с ближайшими ложными совпадениями: Ann рядом с annoyed, Cross рядом с across, bar рядом с barbecue.
- Run real messages. Paste ordinary samples from the setting, including the five-message broad-key check. A regex can be correct in isolation and noisy in the language the chat actually uses.Прогоните настоящие сообщения. Вставьте обычные примеры из сеттинга, включая проверку слишком общих ключей на пяти сообщениях. Сам по себе регекс может быть правильным, но давать много лишних срабатываний на языке реального чата.
For SillyTavern, I use ACE ENTRY TRACK instead of reading raw console logs. Reproduce the message, then check confirmed activations, matched keys, scan sources, token budget and timed states in its live panel. This helps separate a regex miss from cooldown, delay or budget pressure; if the entry is absent, also confirm that its lorebook and the entry itself are enabled.В SillyTavern вместо чтения сырых логов консоли я использую ACE ENTRY TRACK. Повторите реплику и проверьте в его панели подтверждённые срабатывания, совпавшие ключи, источники сканирования, бюджет токенов и тайминги. Так проще отличить несовпадение регекса от кулдауна, задержки или нехватки бюджета; если записи в панели нет, также убедитесь, что включены сам лорбук и запись.
Regex for Russian textРегексы для русского текста
JavaScript \b does not provide reliable boundaries for Russian Cyrillic letters. A regex such as /\bмир\b/i can fail silently because those letters are not treated as the word characters the boundary expects.JavaScript \b не даёт надёжных границ для букв русского кириллического алфавита. Регекс вроде /\bмир\b/i может молча не сработать, потому что эти буквы не считаются символами слова, на которые опирается граница.
For Russian words, use negative lookaround with the Russian letter range written explicitly. Prefer named endings: an open continuation accepts every Russian-letter continuation, not only real word forms, and needs careful false-positive testing.Для русских слов используйте отрицательную проверку контекста с явно заданным диапазоном русских букв. Предпочитайте явные окончания: открытое продолжение принимает любое сочетание русских букв, а не только настоящие словоформы, и требует тщательной проверки ложных совпадений.
/(?<![А-Яа-яЁё])говор(?:ить|ит|ил|ят)(?![А-Яа-яЁё])/i
- говорить
- говорит
- говорил
- говорят
- разговор
- договорить
- говорня
/(?<![А-Яа-яЁё])город(?![А-Яа-яЁё])/i
- город
- город!
- «город»
- (ГОРОД)
- город?
- пригород
- городской
- городок
- города
- городами
The exclamation mark, question mark, quotation marks and brackets are accepted because none is a Russian letter. They sit outside the match: the regex still matches only город.Восклицательный и вопросительный знаки, кавычки и скобки не мешают совпадению, потому что они не являются русскими буквами. Они остаются за пределами совпадения: регекс по-прежнему находит только город.
Rules I keepМои правила
- When several Russian word forms share a stem, keep at least four fixed letters in that stem. List the intended endings explicitly; allow any continuation only when every possible match belongs to the entry.Если несколько русских словоформ строятся от одной основы, оставляйте в ней не менее четырёх неизменных букв. Перечисляйте нужные окончания явно; разрешайте любое продолжение только тогда, когда каждое возможное совпадение подходит записи.
- Include both
Ёandёin every boundary class, exactly as shown.Включайте иЁ, иёв каждый класс границы, ровно как показано. - Use the exact-word regex for false-positive pairs such as город/пригород, касса/инкассация, ключ/ключица and голос/голосовой.Для пар с ложными совпадениями используйте регекс точного слова: город/пригород, касса/инкассация, ключ/ключица и голос/голосовой.
- Add transliterated foreign names when the chat may use them:
ДезalongsideDez, for example.Добавляйте транслитерированные иностранные имена, если они могут появиться в чате: например,Дезрядом сDez.
JanitorAI: test the implementationJanitorAI: проверяйте реализацию
JanitorAI does not have one platform-wide rule for Cyrillic keywords or regexes. Their behaviour depends on the lorebook editor or script in use: one implementation may preserve Russian text, while another may normalize it or expect a different field format.В JanitorAI нет единого для всей платформы правила работы кириллических ключей и регексов. Поведение зависит от редактора лорбука или используемого скрипта: одна реализация может сохранять русский текст, а другая — преобразовывать его или ожидать другой формат поля.
I have not personally tested Cyrillic regexes in JanitorAI, so I cannot confirm that the examples above work in every implementation. Check the documentation for the active editor or script, save the regex in its expected form, then test at least one sentence that must match and one that must not.Я сама ещё не проверяла кириллические регексы в JanitorAI, поэтому не могу подтвердить, что примеры выше работают в каждой реализации. Проверьте документацию активного редактора или скрипта, сохраните регекс в нужном для него формате, а затем протестируйте хотя бы одно предложение, которое должно совпасть, и одно, которое не должно.
Do not assume that SillyTavern's /.../i form, a JavaScript array or a plain keyword field is portable to every JanitorAI implementation. Use the controls and format documented by the one currently active.Не считайте, что формат SillyTavern /.../i, массив JavaScript или обычное поле ключей подойдут любой реализации JanitorAI. Используйте элементы управления и формат, указанные для активного редактора или скрипта.