求一个正则表达式

大城市小葫芦 2016-04-25 07:24:37
在一个【0-9】构成的字符串中,仅由两个或者三个数字组成的字符串的正则怎么写?
比如181818
...全文
160 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-04-28
  • 打赏
  • 举报
回复
正则表达式不是图灵完备的吧。←也许我自己都不知道我说的这句话的实际意思是指什么。 说人话可能对应:在一个【0-9】构成的字符串中,仅由两个或者三个数字组成的字符串的正则是写不出来的。
大城市小葫芦 2016-04-28
  • 打赏
  • 举报
回复
引用 8 楼 zhao4zhong1 的回复:
[quote=引用 7 楼 big_thinker 的回复:] [quote=引用 6 楼 SXJIAKE 的回复:] 你要的正则表达式,有点难。并非简单的规则匹配,这可能要用程序判断了吧。
程序判断就让程序比较复杂,最好是用正则,但是这个不大好写出来....[/quote] 我都下过结论说正则表达式实现这个很难了。楼主不信?反正我信了。
//1、连续4个及以上的同样的数字,比如2222546等;
//2、包含5个连续递增的数字或者递减的数字,比如1234512和3498765等
//3、包含AAABB或者AABBB的字符串,比如22233567和22333567等
//4、仅有2个或者3个数字字符组成的字符串,比如1616161和186168186等
//5、包含AAA+BBB格式的字符串,比如2228333和34447666等
//6、包含AABBCC格式的字符串,比如33225512等
//7、包含生日号,比如19740820和219930621等
//8、包含特殊含义的字符串,比如8881956和1314156等
//9、以AAA开头或者结尾的字符串,比如2221956和1956222等
//说明:字符串全部由数字构成,第一个字符的范围为[1-9],其他位上可以包含0,字符串无位数要求
#pragma warning(disable:4018)
#include <iostream>
#include <string>
#include <regex>
using namespace std;
int ct[10],nc;
int i,j;
char c;
int main(int argc,char **argv) {
    if (argc<2) {
        cout<<"Usage: "<<argv[0]<<" string"<<endl;
        return 2;
    }
    string s(argv[1]);
    if (!('1'<=s[0] && s[0]<='9')) {
        cout<<s<<" 第一个字符的范围不在[1-9]中"<<endl;
        return 1;
    }
    for (j=0;j<s.length();j++) {
        c=s[j];
        if (!('0'<=c && c<='9')) {
            cout<<s<<" 不是全部由数字构成"<<endl;
            return 1;
        }
    }
    char *regs_str[9]={
        "(\\d)\\1\\1\\1"                                                          ,//1、连续4个及以上的同样的数字,比如2222546等;
        "01234|12345|23456|34567|45678|56789|98765|87654|76543|65432|54321|43210" ,//2、包含5个连续递增的数字或者递减的数字,比如1234512和3498765等
        "(\\d)\\1\\1(\\d)\\2|(\\d)\\3(\\d)\\4\\4"                                 ,//3、包含AAABB或者AABBB的字符串,比如22233567和22333567等
        "仅有2个或者3个数字字符组成的字符串"/*这个用正则好象很难实现*/            ,//4、仅有2个或者3个数字字符组成的字符串,比如1616161和186168186等
        "(\\d)\\1\\1\\d*?(\\d)\\2\\2"                                             ,//5、包含AAA+BBB格式的字符串,比如2228333和34447666等
        "(\\d)\\1(\\d)\\2(\\d)\\3"                                                ,//6、包含AABBCC格式的字符串,比如33225512等
        "(19[5-9]\\d|20[01]\\d)[01]\\d[0-3]\\d"/*这个用正则精确实现也很难*/       ,//7、包含生日号,比如19740820和219930621等
        "8881956|1314156"                                                         ,//8、包含特殊含义的字符串,比如8881956和1314156等
        "^(\\d)\\1\\1|(\\d)\\2\\2$"                                               ,//9、以AAA开头或者结尾的字符串,比如2221956和1956222等
    };
    regex regs[9];
    for (i=0;i<9;i++) {
        regs[i]=regex(regs_str[i]);
        if (i==3) {
            for (j=0;j<10;j++) ct[j]=0;
            for (j=0;j<s.length();j++) {
                c=s[j];
                if ('0'<=c && c<='9') {
                    ct[c-'0']++;
                } else break;
            }
            if (j<s.length()) break;
            nc=0;
            for (j=0;j<10;j++) if (ct[j]) nc++;
            if (nc==2 || nc==3) {
                cout<<s<<" match rule "<<(i+1)<<":"<<regs_str[i]<<endl;
                return 1;
            }
        } else if (regex_search(s,regs[i])) {
            cout<<s<<" match rule "<<(i+1)<<":"<<regs_str[i]<<endl;
            return 1;
        }
    }
    return 0;
}
//C:\test\Debug>test
//Usage: test string
//
//C:\test\Debug>test 2222546
//2222546 match rule 1:(\d)\1\1\1
//
//C:\test\Debug>test 1234512
//1234512 match rule 2:01234|12345|23456|34567|45678|56789|98765|87654|76543|65432|54321|43210
//
//C:\test\Debug>test 3498765
//3498765 match rule 2:01234|12345|23456|34567|45678|56789|98765|87654|76543|65432|54321|43210
//
//C:\test\Debug>test 22233567
//22233567 match rule 3:(\d)\1\1(\d)\2|(\d)\3(\d)\4\4
//
//C:\test\Debug>test 22333567
//22333567 match rule 3:(\d)\1\1(\d)\2|(\d)\3(\d)\4\4
//
//C:\test\Debug>test 2228333
//2228333 match rule 5:(\d)\1\1\d*?(\d)\2\2
//
//C:\test\Debug>test 34447666
//34447666 match rule 5:(\d)\1\1\d*?(\d)\2\2
//
//C:\test\Debug>test 33225512
//33225512 match rule 6:(\d)\1(\d)\2(\d)\3
//
//C:\test\Debug>test 19740820
//19740820 match rule 7:(19[5-9]\d|20[01]\d)[01]\d[0-3]\d
//
//C:\test\Debug>test 219930621
//219930621 match rule 7:(19[5-9]\d|20[01]\d)[01]\d[0-3]\d
//
//C:\test\Debug>test 8881956
//8881956 match rule 8:8881956|1314156
//
//C:\test\Debug>test 1314156
//1314156 match rule 8:8881956|1314156
//
//C:\test\Debug>test 2221956
//2221956 match rule 9:^(\d)\1\1|(\d)\2\2$
//
//C:\test\Debug>test 1956222
//1956222 match rule 9:^(\d)\1\1|(\d)\2\2$
//
//C:\test\Debug>test 01234
//01234 第一个字符的范围不在[1-9]中
//
//C:\test\Debug>test 1234abc
//1234abc 不是全部由数字构成
//
//C:\test\Debug>test 1616161
//1616161 match rule 4:仅有2个或者3个数字字符组成的字符串
//
//C:\test\Debug>test 186168186
//186168186 match rule 4:仅有2个或者3个数字字符组成的字符串
//
[/quote]
引用 8 楼 zhao4zhong1 的回复:
[quote=引用 7 楼 big_thinker 的回复:] [quote=引用 6 楼 SXJIAKE 的回复:] 你要的正则表达式,有点难。并非简单的规则匹配,这可能要用程序判断了吧。
程序判断就让程序比较复杂,最好是用正则,但是这个不大好写出来....[/quote] 我都下过结论说正则表达式实现这个很难了。楼主不信?反正我信了。
//1、连续4个及以上的同样的数字,比如2222546等;
//2、包含5个连续递增的数字或者递减的数字,比如1234512和3498765等
//3、包含AAABB或者AABBB的字符串,比如22233567和22333567等
//4、仅有2个或者3个数字字符组成的字符串,比如1616161和186168186等
//5、包含AAA+BBB格式的字符串,比如2228333和34447666等
//6、包含AABBCC格式的字符串,比如33225512等
//7、包含生日号,比如19740820和219930621等
//8、包含特殊含义的字符串,比如8881956和1314156等
//9、以AAA开头或者结尾的字符串,比如2221956和1956222等
//说明:字符串全部由数字构成,第一个字符的范围为[1-9],其他位上可以包含0,字符串无位数要求
#pragma warning(disable:4018)
#include <iostream>
#include <string>
#include <regex>
using namespace std;
int ct[10],nc;
int i,j;
char c;
int main(int argc,char **argv) {
    if (argc<2) {
        cout<<"Usage: "<<argv[0]<<" string"<<endl;
        return 2;
    }
    string s(argv[1]);
    if (!('1'<=s[0] && s[0]<='9')) {
        cout<<s<<" 第一个字符的范围不在[1-9]中"<<endl;
        return 1;
    }
    for (j=0;j<s.length();j++) {
        c=s[j];
        if (!('0'<=c && c<='9')) {
            cout<<s<<" 不是全部由数字构成"<<endl;
            return 1;
        }
    }
    char *regs_str[9]={
        "(\\d)\\1\\1\\1"                                                          ,//1、连续4个及以上的同样的数字,比如2222546等;
        "01234|12345|23456|34567|45678|56789|98765|87654|76543|65432|54321|43210" ,//2、包含5个连续递增的数字或者递减的数字,比如1234512和3498765等
        "(\\d)\\1\\1(\\d)\\2|(\\d)\\3(\\d)\\4\\4"                                 ,//3、包含AAABB或者AABBB的字符串,比如22233567和22333567等
        "仅有2个或者3个数字字符组成的字符串"/*这个用正则好象很难实现*/            ,//4、仅有2个或者3个数字字符组成的字符串,比如1616161和186168186等
        "(\\d)\\1\\1\\d*?(\\d)\\2\\2"                                             ,//5、包含AAA+BBB格式的字符串,比如2228333和34447666等
        "(\\d)\\1(\\d)\\2(\\d)\\3"                                                ,//6、包含AABBCC格式的字符串,比如33225512等
        "(19[5-9]\\d|20[01]\\d)[01]\\d[0-3]\\d"/*这个用正则精确实现也很难*/       ,//7、包含生日号,比如19740820和219930621等
        "8881956|1314156"                                                         ,//8、包含特殊含义的字符串,比如8881956和1314156等
        "^(\\d)\\1\\1|(\\d)\\2\\2$"                                               ,//9、以AAA开头或者结尾的字符串,比如2221956和1956222等
    };
    regex regs[9];
    for (i=0;i<9;i++) {
        regs[i]=regex(regs_str[i]);
        if (i==3) {
            for (j=0;j<10;j++) ct[j]=0;
            for (j=0;j<s.length();j++) {
                c=s[j];
                if ('0'<=c && c<='9') {
                    ct[c-'0']++;
                } else break;
            }
            if (j<s.length()) break;
            nc=0;
            for (j=0;j<10;j++) if (ct[j]) nc++;
            if (nc==2 || nc==3) {
                cout<<s<<" match rule "<<(i+1)<<":"<<regs_str[i]<<endl;
                return 1;
            }
        } else if (regex_search(s,regs[i])) {
            cout<<s<<" match rule "<<(i+1)<<":"<<regs_str[i]<<endl;
            return 1;
        }
    }
    return 0;
}
//C:\test\Debug>test
//Usage: test string
//
//C:\test\Debug>test 2222546
//2222546 match rule 1:(\d)\1\1\1
//
//C:\test\Debug>test 1234512
//1234512 match rule 2:01234|12345|23456|34567|45678|56789|98765|87654|76543|65432|54321|43210
//
//C:\test\Debug>test 3498765
//3498765 match rule 2:01234|12345|23456|34567|45678|56789|98765|87654|76543|65432|54321|43210
//
//C:\test\Debug>test 22233567
//22233567 match rule 3:(\d)\1\1(\d)\2|(\d)\3(\d)\4\4
//
//C:\test\Debug>test 22333567
//22333567 match rule 3:(\d)\1\1(\d)\2|(\d)\3(\d)\4\4
//
//C:\test\Debug>test 2228333
//2228333 match rule 5:(\d)\1\1\d*?(\d)\2\2
//
//C:\test\Debug>test 34447666
//34447666 match rule 5:(\d)\1\1\d*?(\d)\2\2
//
//C:\test\Debug>test 33225512
//33225512 match rule 6:(\d)\1(\d)\2(\d)\3
//
//C:\test\Debug>test 19740820
//19740820 match rule 7:(19[5-9]\d|20[01]\d)[01]\d[0-3]\d
//
//C:\test\Debug>test 219930621
//219930621 match rule 7:(19[5-9]\d|20[01]\d)[01]\d[0-3]\d
//
//C:\test\Debug>test 8881956
//8881956 match rule 8:8881956|1314156
//
//C:\test\Debug>test 1314156
//1314156 match rule 8:8881956|1314156
//
//C:\test\Debug>test 2221956
//2221956 match rule 9:^(\d)\1\1|(\d)\2\2$
//
//C:\test\Debug>test 1956222
//1956222 match rule 9:^(\d)\1\1|(\d)\2\2$
//
//C:\test\Debug>test 01234
//01234 第一个字符的范围不在[1-9]中
//
//C:\test\Debug>test 1234abc
//1234abc 不是全部由数字构成
//
//C:\test\Debug>test 1616161
//1616161 match rule 4:仅有2个或者3个数字字符组成的字符串
//
//C:\test\Debug>test 186168186
//186168186 match rule 4:仅有2个或者3个数字字符组成的字符串
//
[/quote] 没有解决不掉的技术问题,我就是再试试啊......
赵4老师 2016-04-27
  • 打赏
  • 举报
回复
引用 7 楼 big_thinker 的回复:
[quote=引用 6 楼 SXJIAKE 的回复:] 你要的正则表达式,有点难。并非简单的规则匹配,这可能要用程序判断了吧。
程序判断就让程序比较复杂,最好是用正则,但是这个不大好写出来....[/quote] 你以为用正则表达式判断不复杂? 要是你单步调试到随便哪个正则表达式匹配对应的C/C++源代码或这些源代码对应的汇编指令里面过一圈,你和你的小伙伴们都会惊呆的。
赵4老师 2016-04-27
  • 打赏
  • 举报
回复
引用 7 楼 big_thinker 的回复:
[quote=引用 6 楼 SXJIAKE 的回复:] 你要的正则表达式,有点难。并非简单的规则匹配,这可能要用程序判断了吧。
程序判断就让程序比较复杂,最好是用正则,但是这个不大好写出来....[/quote] 我都下过结论说正则表达式实现这个很难了。楼主不信?反正我信了。
//1、连续4个及以上的同样的数字,比如2222546等;
//2、包含5个连续递增的数字或者递减的数字,比如1234512和3498765等
//3、包含AAABB或者AABBB的字符串,比如22233567和22333567等
//4、仅有2个或者3个数字字符组成的字符串,比如1616161和186168186等
//5、包含AAA+BBB格式的字符串,比如2228333和34447666等
//6、包含AABBCC格式的字符串,比如33225512等
//7、包含生日号,比如19740820和219930621等
//8、包含特殊含义的字符串,比如8881956和1314156等
//9、以AAA开头或者结尾的字符串,比如2221956和1956222等
//说明:字符串全部由数字构成,第一个字符的范围为[1-9],其他位上可以包含0,字符串无位数要求
#pragma warning(disable:4018)
#include <iostream>
#include <string>
#include <regex>
using namespace std;
int ct[10],nc;
int i,j;
char c;
int main(int argc,char **argv) {
    if (argc<2) {
        cout<<"Usage: "<<argv[0]<<" string"<<endl;
        return 2;
    }
    string s(argv[1]);
    if (!('1'<=s[0] && s[0]<='9')) {
        cout<<s<<" 第一个字符的范围不在[1-9]中"<<endl;
        return 1;
    }
    for (j=0;j<s.length();j++) {
        c=s[j];
        if (!('0'<=c && c<='9')) {
            cout<<s<<" 不是全部由数字构成"<<endl;
            return 1;
        }
    }
    char *regs_str[9]={
        "(\\d)\\1\\1\\1"                                                          ,//1、连续4个及以上的同样的数字,比如2222546等;
        "01234|12345|23456|34567|45678|56789|98765|87654|76543|65432|54321|43210" ,//2、包含5个连续递增的数字或者递减的数字,比如1234512和3498765等
        "(\\d)\\1\\1(\\d)\\2|(\\d)\\3(\\d)\\4\\4"                                 ,//3、包含AAABB或者AABBB的字符串,比如22233567和22333567等
        "仅有2个或者3个数字字符组成的字符串"/*这个用正则好象很难实现*/            ,//4、仅有2个或者3个数字字符组成的字符串,比如1616161和186168186等
        "(\\d)\\1\\1\\d*?(\\d)\\2\\2"                                             ,//5、包含AAA+BBB格式的字符串,比如2228333和34447666等
        "(\\d)\\1(\\d)\\2(\\d)\\3"                                                ,//6、包含AABBCC格式的字符串,比如33225512等
        "(19[5-9]\\d|20[01]\\d)[01]\\d[0-3]\\d"/*这个用正则精确实现也很难*/       ,//7、包含生日号,比如19740820和219930621等
        "8881956|1314156"                                                         ,//8、包含特殊含义的字符串,比如8881956和1314156等
        "^(\\d)\\1\\1|(\\d)\\2\\2$"                                               ,//9、以AAA开头或者结尾的字符串,比如2221956和1956222等
    };
    regex regs[9];
    for (i=0;i<9;i++) {
        regs[i]=regex(regs_str[i]);
        if (i==3) {
            for (j=0;j<10;j++) ct[j]=0;
            for (j=0;j<s.length();j++) {
                c=s[j];
                if ('0'<=c && c<='9') {
                    ct[c-'0']++;
                } else break;
            }
            if (j<s.length()) break;
            nc=0;
            for (j=0;j<10;j++) if (ct[j]) nc++;
            if (nc==2 || nc==3) {
                cout<<s<<" match rule "<<(i+1)<<":"<<regs_str[i]<<endl;
                return 1;
            }
        } else if (regex_search(s,regs[i])) {
            cout<<s<<" match rule "<<(i+1)<<":"<<regs_str[i]<<endl;
            return 1;
        }
    }
    return 0;
}
//C:\test\Debug>test
//Usage: test string
//
//C:\test\Debug>test 2222546
//2222546 match rule 1:(\d)\1\1\1
//
//C:\test\Debug>test 1234512
//1234512 match rule 2:01234|12345|23456|34567|45678|56789|98765|87654|76543|65432|54321|43210
//
//C:\test\Debug>test 3498765
//3498765 match rule 2:01234|12345|23456|34567|45678|56789|98765|87654|76543|65432|54321|43210
//
//C:\test\Debug>test 22233567
//22233567 match rule 3:(\d)\1\1(\d)\2|(\d)\3(\d)\4\4
//
//C:\test\Debug>test 22333567
//22333567 match rule 3:(\d)\1\1(\d)\2|(\d)\3(\d)\4\4
//
//C:\test\Debug>test 2228333
//2228333 match rule 5:(\d)\1\1\d*?(\d)\2\2
//
//C:\test\Debug>test 34447666
//34447666 match rule 5:(\d)\1\1\d*?(\d)\2\2
//
//C:\test\Debug>test 33225512
//33225512 match rule 6:(\d)\1(\d)\2(\d)\3
//
//C:\test\Debug>test 19740820
//19740820 match rule 7:(19[5-9]\d|20[01]\d)[01]\d[0-3]\d
//
//C:\test\Debug>test 219930621
//219930621 match rule 7:(19[5-9]\d|20[01]\d)[01]\d[0-3]\d
//
//C:\test\Debug>test 8881956
//8881956 match rule 8:8881956|1314156
//
//C:\test\Debug>test 1314156
//1314156 match rule 8:8881956|1314156
//
//C:\test\Debug>test 2221956
//2221956 match rule 9:^(\d)\1\1|(\d)\2\2$
//
//C:\test\Debug>test 1956222
//1956222 match rule 9:^(\d)\1\1|(\d)\2\2$
//
//C:\test\Debug>test 01234
//01234 第一个字符的范围不在[1-9]中
//
//C:\test\Debug>test 1234abc
//1234abc 不是全部由数字构成
//
//C:\test\Debug>test 1616161
//1616161 match rule 4:仅有2个或者3个数字字符组成的字符串
//
//C:\test\Debug>test 186168186
//186168186 match rule 4:仅有2个或者3个数字字符组成的字符串
//
renwotao2009 2016-04-26
  • 打赏
  • 举报
回复
[[:digit]]{2,3}
大城市小葫芦 2016-04-26
  • 打赏
  • 举报
回复
引用 1 楼 dustpg 的回复:
反向引用就行了
引用 2 楼 u014444402 的回复:

Pattern p = Pattern.compile("([\\d]{1,3})(\\1)*");
java的写法。
不好意思,我表述的可能不是很清楚,我的意思是该数字字符串中出现的不同的数字个数最多是3,比如12323112是满足需求的
老王爱上猫 2016-04-26
  • 打赏
  • 举报
回复
答案不是2楼就是3楼,没明白你说的具体意思.
大城市小葫芦 2016-04-26
  • 打赏
  • 举报
回复
引用 6 楼 SXJIAKE 的回复:
你要的正则表达式,有点难。并非简单的规则匹配,这可能要用程序判断了吧。
程序判断就让程序比较复杂,最好是用正则,但是这个不大好写出来....
「已注销」 2016-04-26
  • 打赏
  • 举报
回复
你要的正则表达式,有点难。并非简单的规则匹配,这可能要用程序判断了吧。
灌水号 2016-04-25
  • 打赏
  • 举报
回复

Pattern p = Pattern.compile("([\\d]{1,3})(\\1)*");
java的写法。
dustpg 2016-04-25
  • 打赏
  • 举报
回复
反向引用就行了

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧