我正在寻找一个正则表达式来查找字符串中的数字;如果我有这样的字符串:
li 12.12 si 43,23 45 31 uf 889 uf31 3.12345
我只想找到数字:
12.12 45 31 889 3.12345
我尝试了以下模式:
((\\+|-)?[[:digit:]]+)(\\.(([[:digit:]]+)?))?
但输出包括 uf31
和 43,23
。
我试过:
(?!([a-z]*((\\+|-)?[[:digit:]]+)(\\.(([[:digit:]]+)?)) ?[a-z]*))?((\\+|-)?[[:digit:]]+)(\\.(([[:digit:]]+)?))?
但这给出了相同的结果。
解决方案是什么?
解决方案 留给后代的解决方案:
- 如果您正在寻找不使用正则表达式的简单有效的解决方案,请参阅 Jonathan Mee's post below
如果您正在寻找使用 RegEx 的解决方案,请参阅 the wonderful regex from stribizhev
R"((?:^|\s)([+-]?[[:digit:]]+(?:\.[[:digit:]]+)?)(?= $|\s))"
最佳答案
实际上,C++ 正则表达式模块支持先行。
这是我的建议:
#include <iostream>
#include <regex>
using namespace std;
int main() {
std::string buffer = " li 12.12 si 43,23 45 31 uf 889 uf31 3.12345";
std::regex rx(R"((?:^|\s)([+-]?[[:digit:]]+(?:\.[[:digit:]]+)?)(?=$|\s))"); // Declare the regex with a raw string literal
std::smatch m;
std::string str = buffer;
while (regex_search(str, m, rx)) {
std::cout << "Number found: " << m[1] << std::endl; // Get Captured Group 1 text
str = m.suffix().str(); // Proceed to the next match
}
return 0;
}
参见 IDEONE demo
由于原始字符串字面量声明,不需要在 \s
中使用双反斜杠。
先行 (?=$|\s)
检查是否存在,但不消耗空格,可以提取连续的数字。
注意,如果你需要提取像.5
这样的十进制值,你需要
R"((?:^|\s)([+-]?[[:digit:]]*\.?[[:digit:]]+)(?=$|\s))"
关于c++ - 正则表达式只有字符串中的数字 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33520934/