我需要能够检测字符串何时有8个或更多数字,即使它们被句点分隔 - 但总共8个或更多不能包含句点。换句话说,我可以在查找包含8个或更多数字的数字字符串时忽略句点。
我已经尝试过无数组合的捕获组和非捕获组,常规组和否定组,我只是无法弄明白。但是,我已经简化了下面的示例,以显示问题。
例如,以下正则表达式将匹配,即使总共只有6个数字,但总共有8个字符(显然):
Expression: [0-9\.]{8,}
Text: 12.34.56
是否有正则表达式允许我忽略这些句点?
答案 0 :(得分:2)
这将验证数字8次或更多次#include <memory>
#include <iostream>
template<typename T, typename TPtr>
struct Deep
{
TPtr ptr;
Deep() : ptr(new T) {}
T get() const { return *ptr; }
void set(T t) { *ptr = t; }
Deep(const Deep& other): ptr(new T(*other.ptr)) {}
};
template<typename T, typename TPtr>
struct Shallow
{
TPtr ptr;
Shallow() : ptr(new T) {}
T get() const { return *ptr; }
void set(T t) { *ptr = t; }
Shallow(const Shallow& other) = default;
};
template<typename T>
using raw_ptr = T*;
template<typename T>
void test(const T& a1)
{
auto a2 = a1;
a2.set(a2.get() + 1);
std::cout << a1.get() << " " << a2.get() << std::endl;
}
using std::shared_ptr;
int main()
{
Deep<int, raw_ptr<int> > rawDeep;
rawDeep.set(1);
test(rawDeep);
Deep<int, shared_ptr<int> > sharedDeep;
sharedDeep.set(1);
test(sharedDeep);
Shallow<int, raw_ptr<int> > rawShallow;
rawShallow.set(1);
test(rawShallow);
Shallow<int, shared_ptr<int> > sharedShallow;
sharedShallow.set(1);
test(sharedShallow);
}
基本上,单个数字^\D*(?:\d\D*){8,}$
被可选的非数字\d
包围
并且在一组中匹配,8次或更多次。
格式化:
\D