# Использование регулярных выражений с отслеживаемыми словами

**URL:** https://meta.discourse.org/t/using-regex-with-watched-words/241861
**Category:** Site Management
**Tags:** reference, regex, watched-words, content
**Created:** [13.Октябрь.2022 19:01:36 UTC](https://meta.discourse.org/t/using-regex-with-watched-words/241861 "2022-10-13T19:01:36Z")
**Posts on this page:** 1
**Showing post:** 1

<div class="post-metadata">

### Author: ![Discourse](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/discourse/32/148734_2.png) [@Discourse](https://meta.discourse.org/u/Discourse)
#### Post date: [13.Октябрь.2022 19:01:37 UTC](https://meta.discourse.org/t/using-regex-with-watched-words/241861/1 "2022-10-13T19:01:37Z")

</div>

🔖 Эта тема объясняет, как эффективно использовать регулярные выражения (regex) в функции [Watched Words](https://meta.discourse.org/t/watched-words-reference-guide/241735) на Discourse.

:discourse: Для сайтов на нашем хостинге эти настройки скрыты. Клиенты с платными тарифами могут обратиться в нашу службу поддержки по адресу `team@discourse.org`, чтобы запросить использование regex с функцией Watched Words.  
**Примечание** : Эта функция недоступна в нашем бесплатном тарифе хостинга.

Регулярные выражения (regex) — это мощный инструмент для определения шаблонов поиска. Вы можете использовать regex в функции [Watched Words](https://meta.discourse.org/t/watched-words-reference-guide/241735), чтобы повысить точность и гибкость фильтрации слов на вашем сайте Discourse.

ℹ Чтобы использовать регулярные выражения (regex) в Watched Words, вы должны сначала включить настройку сайта `watched_words_regular_expressions`.

⚠ Regex чрезвычайно мощный и поэтому опасный. Неправильно написанное регулярное выражение может вызвать проблемы у ваших пользователей. Протестируйте свои regex-выражения на тестовых (не продакшн) экземплярах перед запуском в работу.

## Примеры шаблонов Regex

Вот несколько распространённых шаблонов regex и способы их применения:

### Регистронезависимость

По умолчанию Discourse сопоставляет как заглавные, так и строчные формы слова.

: `thread`

Это будет соответствовать `thread`, `THREAD` и `thReAd`.

### Альтернативы символов

Используйте альтернативы символов, чтобы расширить поиск.

: `(t|7)hr(3|e)(4|a)d`

Это будет соответствовать всем вышеперечисленным случаям, а также `thr3ad`, `7hread` и `thr34d`.

: `threads?\b`

Это будет соответствовать `thread` и `threads`, но не `threaded` или `threading`.

### Границы слов

Шаблоны regex могут случайно совпадать с частями слов. Используйте границы слов, чтобы избежать частичных совпадений.

```plaintext
\bthreads?\b

```

Это соответствует `thread` и `threads`, но избегает совпадений вроде `threadlike` или `unthreading`.

### Обработка символов Unicode

Стандартные границы слов могут не работать с символами Unicode. Создавайте границы для символов, которые плохо обрабатываются в JavaScript regex.

: `gr(ü|ue)(ß|ss)e`

Это соответствует всем распространённым написаниям слова grüße — включая `gruesse` и `GRÜSSE`.

Допустим, вы хотите заблокировать слово `Über`, но не `Übersicht`. Использование границ слов вроде `\b(ü|ue)ber\b` не работает, потому что некоторые флаги границ слов в JavaScript regex не обрабатывают символы Unicode. Вместо этого вам нужно создать свои собственные границы.

: `(?:^|\s)(ü|ue)ber\b`

Теперь это правильно будет соответствовать `Über` и `ueber`, но не `Übersicht` или `uebersicht`.

### Выявление умышленной замены символов

Чтобы выявлять слова, где пользователи заменяют буквы на цифры или специальные символы:

```plaintext
\bp[a@]ssw[o0]rd\b

```

Это соответствует: `password`, `p@ssword`, `passw0rd`, `p@ssw0rd`, но не `mypassword` или `password123`.

### Обработка символов с пунктуацией между ними

Чтобы выявлять попытки обхода фильтров путём вставки пунктуации:

```plaintext
\bs\W*p\W*a\W*m\b

```

Это соответствует: `spam`, `s.p.a.m`, `s-p-a-m`, но не `s_p_a_m` (подчёркивание считается символом слова), `spammy` или `myspam`.

### Сопоставление нескольких вариантов слов

Для сопоставления фраз, которые могут появляться в разных формах:

```plaintext
\b(contact|email|reach)( us| me)?\b

```

Это соответствует: `contact`, `contact us`, `contact me`, `email`, `email us`, `email me`, `reach`, `reach us`, `reach me`.

### Обнаружение шаблонов email-адресов

Чтобы выявлять общие шаблоны email-адресов:

```plaintext
\b[\w.%+-]+@[\w.-]+\.[a-zA-Z]{2,}\b

```

Это соответствует: `user@example.com`, `my.name@sub.domain.co.uk`, `user+tag@domain.org`.

### Поиск вариантов хэштегов

Чтобы сопоставлять хэштеги с разным регистром или небольшими вариациями:

```plaintext
\#(disc[o0]urse|f[o0]rum)\b

```

Это соответствует: `#discourse`, `#DISCOURSE`, `#disc0urse`, `#forum`, `#f0rum`, но не `#discourseengine` или `#forums`.

### Обнаружение повторяющихся паттернов

Чтобы выявлять повторяющиеся символы, которые могут указывать на спам:

```plaintext
([a-zA-Z])\1{3,}

```

Это соответствует: `aaaample`, `helllllo`, `yessssss`, обнаруживая любую букву, повторяющуюся 4 и более раз подряд.

### Поиск URL с протоколом и без него

```plaintext
\b(?:https?:\/\/)?[\w-]+(\.[\w-]+)+\b

```

Это соответствует: `example.com`, `sub.domain.org`, `https://discourse.org`, `http://meta.discourse.org`.

### Избегание вложенных классов символов

**Правильно:**

```plaintext
(hold)?

```

Это правильно соответствует необязательному слову “hold”.

Или, если нужны альтернативы символов:

```plaintext
[h][o0][l1][d]

```

Это соответствует: `hold`, `h0ld`, `ho1d`, `h01d`.

**Неправильно:**

```plaintext
[h[o0][l1]d]?

```

Это неправильно пытается вложить классы символов и будет соответствовать любому отдельному символу из `h`, `o`, `0`, `l`, `1` или `d`, что приведёт к совпадению слов вроде `had`, `old` и т.д.

### Использование скобок для необязательных слов

**Правильно:**

```plaintext
forum(s)?

```

Это правильно соответствует: `forum`, `forums`.

**Неправильно:**

```plaintext
forum[s]?

```

Это соответствует “forum” с необязательным “s”, но использует класс символов без необходимости.

### Правильное использование классов символов

**Правильно:**

```plaintext
bad word

```

Для сопоставления фразы “bad word”.

Или пример с классом символов:

```plaintext
[bB][aA][dD]

```

Это соответствует: `bad`, `Bad`, `bAd`, `BAD` и т.д.

**Неправильно:**

```plaintext
[bad word]

```

Это соответствует любому отдельному символу из `b`, `a`, `d`, `w`, `o`, `r` или `d`, а не фразе “bad word”.

### Эффективное использование квантификаторов

```plaintext
\b[0-9]{3,5}\b

```

Это соответствует числам от 3 до 5 цифр: `123`, `1234`, `12345`, но не `12` или `123456`.

Для конкретных повторяющихся паттернов:

```plaintext
(spam){2,3}

```

Это соответствует: `spamspam`, `spamspamspam`.

### Правильное применение границ слов

**Без границ:**

```plaintext
free

```

Это соответствует: `free`, `freedom`, `carefree`.

**С границами:**

```plaintext
\bfree\b

```

Это соответствует только: `free`, но не `freedom` или `carefree`.

### Правильная обработка символов Unicode

**Правильный подход:**

```plaintext
(?:^|\s)(ö|oe)zel\b

```

Это соответствует: `özel`, `oezel` на границах слов, даже с символами Unicode.

**Неправильный подход:**

```plaintext
\bözel\b

```

Это может не работать корректно с турецкой буквой ö.

## Дополнительная информация

ℹ Вы можете тестировать регулярные выражения на [https://regex101.com/](https://regex101.com/). Если вы это делаете, убедитесь, что переключили режим регулярных выражений на ECMAScript.

Обратные ссылки на группы захвата regex (например, `\1` в строках замены) не поддерживаются в значениях замены Watched Words. Действия замены и создания ссылок поддерживают regex для сопоставления, но замена всегда является буквенно-цифровой строкой.

---

_[View the full topic](https://meta.discourse.org/t/using-regex-with-watched-words/241861)._
