正则表达式:查找整数而不是浮点数

本文关键字:浮点数 整数 查找 正则表达式 | 更新日期: 2023-09-27 18:13:49

我想要一个正则表达式模式来查找字符串中的任何整数,但不是浮点数(小数点为"."或",")。所以for string:

abc111.222dfg333hfg44.55

应该只找到:

333年

我创建了regex模式:

(?<!''d[''.,]|''d)''d+(?![''.,]''d+|''d)

,但在c++ STL正则表达式中使用时失败。它抛出异常:

Unhandled exception at at 0x76AF4598 in xxxxxx.exe: Microsoft C++ exception: std::regex_error at memory location 0x00C1F218.

但是它在c# Regex类

中工作得很好

更新:

我代码:

smatch intMatch;
regex e1("(?<!''d[''.,]|''d)''d+(?![''.,]''d+|''d)");
string s("111.222dfg333hfg44.55");
regex_search ( s, intMatch, e1 );

但是会抛出异常:

regex e1("(?<!''d[''.,]|''d)''d+(?![''.,]''d+|''d)");
更新2:

两个答案都是正确的,但对于c++ STL正则表达式Toto一个更好。

正则表达式:查找整数而不是浮点数

我不确定c++ STL,但许多正则表达式不支持可变长度负向后看。

在你的情况下,你可以简单地做:

(?:^|[^.,'d])('d+)(?:[^.,'d]|$)

由于不同语言/版本等使用的正则表达式风格可能存在许多差异。,我会尝试用基本的正则表达式函数来处理这个问题,大多数版本都支持,比如:

'd+[,.]'d+|('d+)

演示

它只使用替代和组捕获,没有查找。整数被捕获到第一组

首先,您需要知道在像[]这样的一组字符中不应该转义元字符,因此您必须写[.,]而不是[''.,]。我试过下面的程序,它似乎找到了正确的匹配

std::string in = "abc111.222dfg333hfg44.55";
boost::regex re("(?<!(''d[.,]|.''d))''d+(?![.,''d])");
boost::sregex_iterator it(in.begin(), in.end(), re);
boost::sregex_iterator end;
for( ;it!=end; ++it)
{
    boost::smatch s = *it;
    std::cout << s[0] << std::endl;
}