2015-06-26 4 views
4

Я хочу регулярное выражение C++, которое соответствует «бананам» или «пижаме», но не «бананам2» или «бананаспаямасам» или «бананам» или вообще ничего, кроме этих двух точных слов. Поэтому я сделал это:Подгонка целых слов с использованием регулярных выражений

#include <regex> 

int main(int argc, char** argv) { 
    static const std::regex bp = std::regex("\bbananas\b|\bpajamas\b"); 
    printf("%d\n", std::regex_match("bananas", bp)); 
} 

За исключением печати 0! Что дает? /\bbananas\b|\bpajamas\b/.test('bananas') дает мне true в Javascript, так что же отличается от C++?

+10

Сделайте двойной '' '' '' в '\ b'. В настоящее время вы указываете обратный символ. Поскольку вы указываете строку конструктору regex, вам нужно убедиться, что конструктор регулярных выражений видит правильную строку - если вы хотите, чтобы конструктор видел '\ b' или' \ s', вам нужно написать '' \\ b "' или '' \\ s "' в строке. Существует также строчная строковая конструкция в C++ 11, IIRC – nhahtdh

+0

Slick! Это сработало. –

ответ

2

Строка Regex должна иметь \bbananas\b|\bpajamas\b. но в C++, "\bbananas\b|\bpajamas\b" return bbananasb|bpajamasb. по этой причине вам необходимо использовать дополнительные \ с \ как "\\bbananas\\b|\\bpajamas\\b"

0

Вы не должны использовать для этого регулярное выражение. Если вы хотите узнать, строка является ли один из двух слов, просто использовать прямое сравнение равенства:

if (str == "bananas" || str == "pajamas") { 
    // OK 
} 

Если у вас есть больше возможностей, вы можете использовать какой-то набор:

const std::unordered_set<std::string> words { 
    "bananas", 
    "pajamas", 
    "papayas" 
}; 

if (words.find(str) != words.end()) { 
    // OK 
} 
Смежные вопросы