Кажется, вы намереваетесь использовать нечто, похожее на «расширенный» синтаксис POSIX regex. POSIX определяет два различных синтаксиса регулярных выражений: «базовый» (читай «устаревший») синтаксис и «расширенный» синтаксис. Чтобы использовать расширенный синтаксис, необходимо добавить флаг REG_EXTENDED
для regcomp
:
...
if(regcomp(&compiled, pattern, REG_EXTENDED) == 0){
...
Без этого флага regcomp будет использовать «базовый» синтаксис регулярных выражений. Есть несколько важных отличий, таких как:
- Нет поддержки оператора
|
- Скобки для субматчей должны быть экранированы,
\(
и \)
Следует также отметить, что расширенный синтаксис регулярных выражений POSIX не совместим 1: 1 с регулярными выражениями Python (не знаю о TextMate) В частности, я боюсь, что эта часть вашего регулярного выражения не работает в POSIX или, по крайней мере, не переносима:
[\\W]
POSIX способ указать непробельные символы:
[^[:space:]]
Все ваши регулярные выражения для POSIX должны выглядеть следующим образом в C:
char *pattern = "((u[0-9]{1,2})|(phaseu)|(phasep)|[^[:space:]]+([xyz])[^[:space:]]+)";