RegExp для всех языков, но без спец символов

Есть регулярное выражение:

const reg = /(?:\s|^)[A-Za-z0-9\-\.\_]+(?:\s|$)/

Принимает только английский алфавит, и запрещает спец символы

Как расширить, чтобы принимал не только английский алфавит, но и буквы всех других мировых языков?


Ответы (1 шт):

Автор решения: Wiktor Stribiżew

Чтобы найти любую букву, необходимо использовать \p{Alphabetic} или \p{L} (первый конструкт находит чуть больше символов, чем второй). В JavaScript также требуется добавить флаг u:

const reg = /(?:\s|^)[\p{Alphabetic}0-9\-._]+(?:\s|$)/u
const reg = /(?:\s|^)[\p{L}0-9\-._]+(?:\s|$)/u

Если нужно заодно находить диакритические знаки, доюавьте \p{M} (или \p{Mn}):

const reg = /(?:\s|^)[\p{Alphabetic}\p{M}0-9\-._]+(?:\s|$)/u
const reg = /(?:\s|^)[\p{L}\p{M}0-9\-._]+(?:\s|$)/u

Если пробельные символы должны быть исключены из совпадения, используйте (?<!\S) и (?!\S) вместо незахватывающих групп:

const reg = /(?<!\S)[\p{Alphabetic}\p{M}0-9\-._]+(?!\S)/u
const reg = /(?<!\S)[\p{L}\p{M}0-9\-._]+(?!\S)/u

Если нужно найти все вхождения, добавьте g после или перед u.

Да, в символьных классах нет нужды экранировать символы . и _. Собственно, если поставить дефис в конце или начале символьного класса, его тоже не надо экранировать, но многие совершают ошибку при добавлении других символов в символьный класс, забывая о том, что нельзя в таких случаях перемещать дефис, поэтому лучше оставить его как есть, то есть экранированным в середине класса.

→ Ссылка