2010-10-20 1 views
2

Для регулярного выражения \ w + \ d на многих языках скриптов, таких как perl/python, это можно записать буквально. Но в C/C++ я должен написать его как:Как избежать обратного слэша при записи регулярного выражения в C/C++

const char *re_str = "\\w+\\d"; 

, который является уродливым для глаз.

Есть ли способ избежать этого? MACRO также приемлемы.

+0

Это синтаксис языка для символов массива символов. Альтернатива, вероятно, еще хуже: '' \ ',' w ',' + ',' \ ',' d ',' \ 0'' –

+0

@Amardeep: «' '' '' работает даже? не будет ли это неверно истолковано как «\»? – sbi

+0

@sbi: Вы совершенно правы. Ускорение не ограничивается только двойными кассами литералов, но также влияет на литералы символов. Я должен был знать, так как я положил \ 0 туда для терминатора. :-) –

ответ

7

Когда я читаю [C: Справочное руководство] Глава 3: Допрессоры. Идея возникает:

#define STR(a) #a 
#define R(var, re) static char var##_[] = STR(re);\ 
const char * var = (var##_[ sizeof(var##_) - 2] = '\0', (var##_ + 1)); 

R(re, "\w\d"); 
printf("Hello, world[%s]\n", re); 

Это портативное как в C и C++, использует только стандартные функции предварительной обработки. Хитрость заключается в том, чтобы использовать макрос для расширения \ in liternal string, а затем удалить строки с двойными кавычками.

Теперь я думаю, что это лучший способ до тех пор, пока C++ 0x не представит новый строковый синтаксис R "...". И для C я думаю, что это будет лучший путь в течение долгого времени.

Побочным эффектом является то, что мы не можем определить такую ​​переменную в глобальной области действия C. Поскольку существует инструкция для удаления символа двойной кавычки. В C++ все в порядке.

+0

Очень приятно. Хорошее решение до тех пор, пока поддерживается C++ 0x. –

+0

Это истинное решение. Назад и переходы совместимы. –

+0

У этого макроса есть недостатки? Небезопасно это использовать? –

1

Нет. В C++ существует только один тип строковых литералов, и он относится к экранированным символам.

2

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

+0

+1 На самом деле собирался предлагать файлы самостоятельно. – Default

8

Подобно тому, как FYI, стандарт на следующий C++ (C++ 0x) будет иметь то, что называется raw string literals, который должен позволить вам сделать что-то вроде:

const char *re_str = R"(\w+\d)"; 

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

+0

Отлично! Спасибо, это мечта для меня о C++. Но, к сожалению, в настоящее время это невозможно использовать, а для C это еще хуже. – zhaorufei

+0

Я проверяю его с помощью vc2010, пока не поддерживается: ошибка C3861: 'R': идентификатор не найден – zhaorufei

Смежные вопросы