Как считать взятие точки в числе в регулярном выражении - PullRequest
1 голос
/ 16 марта 2019

Взгляните на следующее регулярное выражение

std::regex reg("[A][-+]?([0-9]*\\.[0-9]+|[0-9]+)");

Это найдет любую букву A, за которой следует число с плавающей запятой. Проблема, если число A30., это регулярное выражение игнорирует точку и выводит результат как A30. Я хотел бы заставить регулярное выражение также учитывать десятичную точку. Это возможно?

#include <iostream>
#include <string>
#include <regex>
using namespace std;

int main()
{

    std::string line("A50. hsih Y0 his ");
    std::smatch match;
    std::regex reg("[A][-+]?([0-9]*\\.[0-9]+|[0-9]+)");   

    if ( std::regex_search(line,match,reg) ){
            cout << match.str(0) << endl;

        }else{
            cout << "nothing found" << endl;
        }

  return 0;
}

Ответы [ 2 ]

1 голос
/ 16 марта 2019

Вы просите, чтобы за точкой следовала одна или несколько (+) цифр. Просто сделайте трейлинг-код необязательным, изменив его на:

std::regex reg("[A][-+]?([0-9]*\\.[0-9]*|[0-9]+)");   

Демо

Единственная проблема с этим выражением состоит в том, что оно также будет соответствовать A, за которым следует одна точка без какой-либо цифры. Я не знаю, увидели ли вы это действительное совпадение. Следовательно, более надежной альтернативой будет:

std::regex reg("[A][-+]?([0-9]*\\.[0-9]+|[0-9]+\\.?)");   

То есть либо конечные цифры, либо цифры, за которыми, возможно, следует точка.

Второе демо

1 голос
/ 16 марта 2019

Вы можете изменить свое регулярное выражение следующим образом

A[-+]?(?:[0-9]*\\.?(?:[0-9]+)?)
  • A - Совпадения A.
  • [-+]? - Совпадения + или -. (? делает это необязательным)
  • (?:[0-9]*\\.?(?:[0-9]+)?)
    • (?:[0-9]*\\. - будет соответствовать нулю или более цифрам, за которыми следует . (? Делает это необязательным)
    • (?:[0-9]+)? - соответствует одному или нескольким разам. (? делает это необязательным)

Демо

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