C ++ Regex для совпадения с квантификатором '+' - PullRequest
2 голосов
/ 25 ноября 2011

Я хочу соответствовать выражению шаблона

пробел, за которым следует (оператор сложения или вычитания)

Например: " +" должен вернуть True

Я пробовал использовать std::regex_match на следующем регулярном выражении:

" [+-]", "\\s[+-]", "\\s[+\\-]", "\\s[\\+-]"

но все они возвращают ложь.

Каким должно быть правильное выражение?

EDIT

Вот код теста:

#include<iostream>
#include<string>
#include<regex>

using std::cout;
int main()
{
    std::string input;
    std::cin>>input;
    const std::regex ex(" [\\+-]");
    std::smatch m;
    if( std::regex_match(input,ex))
    {
        cout<<"\nTrue";
    }
    else
        cout<<"\nFalse";
    return 0;
}

Ответы [ 5 ]

3 голосов
/ 25 ноября 2011

Теперь, когда вы отправили код, мы можем увидеть, в чем проблема:

std::string input;
std::cin >> input;

Проблема здесь, operator >> пропускает пробел при чтении, поэтому, если вы введете пробел плюс, cin пропустит пробел, и тогда ваше регулярное выражение больше не будет совпадать.

Чтобы заставить эту программу работать, используйте std::getline вместо того, чтобы прочитать все, что было введено до того, как пользователь нажал клавишу ввода (включая пробелы):

std::string input;
std::getline(std::cin, input);
1 голос
/ 25 ноября 2011

Попробуйте, это соответствует строке с пробелом, за которой следует один + или -.

" (\\+|-)"
1 голос
/ 25 ноября 2011

Обычно знак минус должен идти первым: [-abc].Это потому что не смешивать с диапазонами [a-b].

0 голосов
/ 25 ноября 2011

Похоже, vc2010 / C ++ 11 включает в себя библиотеку boost .

http://www.boost.org/doc/libs/1_39_0/libs/regex/doc/html/boost_regex/ref/regex_match.html
редактировать
или, для тех, у кого есть проблемы с этой версией библиотек, они могут использовать эту:
http://www.boost.org/doc/libs/1_48_0/libs/regex/doc/html/boost_regex/ref/regex_match.html
, который точно такой же, как и другой

Документы:

* regex_match *

Обратите внимание, что результат равен true, только если выражение соответствует всей входной последовательности. Если вы хотите найти выражение где-то в последовательности, используйте * regex_search *

Итак, похоже, ".* [+-].*" должен сообщить вам, есть ли пробел, сопровождаемый знаком + - где-то в строке.

Но не уверен в реализации Boost для MS, которая иногда является утомительной библиотекой.

0 голосов
/ 25 ноября 2011

Вы можете попробовать, так как я думаю, что это должно работать, но я еще не проверял это: " [\+-]"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...