Пробелы в регулярных выражениях

Исходные данные в родительском узле могут иметь большое количество ненужных пробелов, что может привести к ошибке переполнения стека (stack overflow), если вы попробуете выполнить этот узел.

Например, правило A+A+ <X> A+A+ найдет все комбинации A в строке AAAA <X> AAAA:

A AAA <X> A AAA
A AAA <X> AA AA
A AAA <X> AAA A
AA AA <X> A AAA
AA AA <X> AA AA
AA AA <X> AAA A
AAA A <X> A AAA
AAA A <X> AA AA
AAA A <X> AAA A
…​

Такие правила опасны и могут привести к переполнению стека.

Чтобы игнорировать все пробелы в правиле, отметьте галочкой опцию Игнорировать пробелы.

Например, правило A B _ С будет преобразовано в правило ABС.

Обычно данная опция очень удобна и полезна. Она позволяет писать такие правила, как:

(^|\s[^[:upper:]\s]+\s+)

#любое слово в нижнем регистре

(?i:ford)

#целевое слово

(\s+[^[:upper:]\s])

#любое слово в нижнем регистре

или

(^|\s $word \s+) (?i:ford) (\s+ $word)

$word = [^[:upper:]\s]+

Рассмотрим конкретный пример. Предположим, что у нас имеются текстовые данные из узла Замена терминов. Эти данные содержат большое количество пробелов. Нам нужно заменить термин "FordCompany". Опции Игнорировать пробелы и Учитывать регистр включены. Условия:

Найти: (^|\s[^[:upper:]]\s)(?i:ford)(\s+[^[:upper:]])
Заменить: $1[FordCompany]$2

[^[:upper:]] находит любые элементы не верхнего регистра, в том числе пробелы. Если заменить \s+ одним пробелом и выполнить замену "Ford", ошибки не возникает.

Следовательно, можно преобразовать правило

(^|\s[^[:upper:]]+\s+)(?i:ford)(\s+[^[:upper:]])

в

(^|\s[^[:upper:]\s]+\s+)(?i:ford)(\s+[^[:upper:]\s])

Это означает, что [^[:upper:]]+ to [^[:upper:]\s]+ - находит все символы нижнего регистра и пробелы.

Чтобы избежать возникновения ошибки переполнения стека, мы также можем добавить узел Замена терминов до текущего узла и заменить \s+ одним пробелом.

Как следует из изложенного выше, PolyAnalyst может игнорировать символы управления (пробелы, абзацы, табуляция), которые используются в регулярных выражениях. Чтобы найти эти символы, нужно использовать одиночные символы и классы символов.

Правило для нахождения слова, перед которым стоит артикль - the -, должно выглядеть как the\s\w+ - а не - the \w+ -. Обратите внимание, что \s используется для нахождения символа пробела.

Однако это поведение по умолчанию всегда можно изменить, отключив опцию Игнорировать пробелы.