Что такое пунктуация в RegEx? Как найти все знаки препинания при выполнении регулярных выражений

Что такое пунктуация в RegEx? Как найти все знаки препинания при выполнении регулярных выражений

Содержание
  1. Как сопоставить все знаки препинания в механизмах RegEx
  2. Как сопоставить все знаки препинания в JavaScript RegEx
  3. Заключение

В регулярных выражениях слово “punct” означает знаки препинания. Это все символы, не являющиеся словами и не содержащие пробелов. “Punct” является предопределенным классом символов в регулярных выражениях, и вы можете использовать его в любом регексе, который его поддерживает.

Класс символов Punct обозначается \p{Punct} или просто \p{P}. Он соответствует любому знаку препинания в строке. К ним относятся такие символы, как точка, запятая, восклицательный знак и кавычки.

Поскольку существует способ сопоставления всех знаков препинания, именно его мы и рассмотрим в этой статье.

Как сопоставить все знаки препинания в механизмах RegEx

Лишь немногие регекс-движки имеют регекс-флаверы, поддерживающие \p{P}. Поэтому для тех, кто поддерживает эту функцию, \p{P} будет соответствовать всем знакам препинания в них.

Для регекс-систем, не поддерживающих \p{P}, можно сопоставить все знаки препинания, отрицая символы слов и пробелов с помощью шаблона [^\w\s]+:

Как сопоставить все знаки препинания в JavaScript RegEx

Если вы хотите использовать шаблон \p{P} для сопоставления всех знаков препинания в JavaScript, то необходимо присвоить ему флаг Unicode, как это сделано в примере /\p{P}/u. В противном случае он не будет работать. Давайте посмотрим на это в действии:

const text = `That said, Kolade, you don't have to forget to take home things you buy at the store again. Do you understand?

I just said that to show you that the pattern really matches punctuation marks. I don't forget things at the store. Here are other punctuation marks:! " # $ % & ' ( ) * + , - . / : ; | < = > { } ? @ [ \ ] ^ _ `;

const regex1 = /\p{P}/gu;
const regex2 = /[^\w\s]+/g;

console.log(regex1.test(text)); //true
console.log(regex2.test(text)); //true

console.log(regex1.exec(text));
console.log(regex2.exec(text));

Поскольку exec() вернет только одно совпадение, а test() - только булево значение, то для просмотра всех совпадений можно воспользоваться циклом exec() и циклом while:

const text = `That said, Kolade, you don't have to forget to take home things you buy at the store again. Do you understand?

I just said that to show you that the pattern really matches punctuation marks. I don't forget things at the store. Here are other punctuation marks:! " # $ % & ' ( ) * + , - . / : ; | < = > { } ? @ [ \ ] ^ _ `;

const regex1 = /\p{P}/gu;
const regex2 = /[^\w\s]+/g;

let match;

while ((match = regex1.exec(text)) !== null) {
	console.log('A match: ', match[0], 'at index: ', match.index);
}

Заключение

Вот как можно сопоставить все знаки препинания в регекс-движках и JavaScript. Не забывайте, что если вы используете \p{P} для сопоставления знаков препинания, то его необходимо использовать с флагом Unicode, как, например, /\p{P}/u. То же самое можно применить и к другим языкам программирования.