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

Исходные данные в родительском узле могут иметь большое количество ненужных пробелов, что может привести к ошибке переполнения стека (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
…​

Такие правила опасны и могут привести к переполнению стека. Примером такого правила может быть запрос вида [^[:upper:]]+\s+. Здесь [^[:upper:]]+ находит любые элементы не верхнего регистра, в том числе пробелы, и \s+ также находит пробелы. Чтобы избежать возникновения ошибки переполнения стека такое правило лучше переписать в виде [^[:upper:]\s]+\s+. Также можно добавить узел Замена терминов до текущего узла и заменить \s+ одним пробелом.

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

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

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

(^|\s)

#начало строки или пробел

([[:lower:]]+ \s+)

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

(?i:ford)

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

(\s+ [[:lower:]]+)

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

или использовать макросы

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

$word = [[:lower:]]+

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

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

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