如何考虑在正则表达式中以DOT为单位

How to consider taking dot in the number in regular expression

本文关键字:DOT 为单位 正则表达式 何考虑      更新时间:2023-10-16

看以下正则表达式

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

这将找到任何字母,然后是浮点数。问题如果数字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;
}

您请求点之后是一个或多个( )数字。只需通过将其更改为:

来使尾随ditigs可选
std::regex reg("[A][-+]?([0-9]*\.[0-9]*|[0-9]+)");   

演示

此表达式的唯一问题是它也将匹配A,其次是一个没有任何数字的单点。我不知道您是否会看到这是有效的匹配。因此,更坚固的选择是:

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

因此,尾数字或数字遵循点的dot。

第二个演示

您可以像这样更改正则

A[-+]?(?:[0-9]*\.?(?:[0-9]+)?)
  • A-匹配A
  • [-+]?-匹配+-。(?使其可选)
  • (?:[0-9]*\.?(?:[0-9]+)?)
    • (?:[0-9]*\.-将匹配零或更多数字,然后是.(?使其可选)
    • (?:[0-9]+)?-匹配一个或多个时间。(?使其可选)

demo