3,882
社区成员
发帖
与我相关
我的任务
分享
//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]
程序判断就让程序比较复杂,最好是用正则,但是这个不大好写出来....[/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]
没有解决不掉的技术问题,我就是再试试啊......
//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个数字字符组成的字符串
//

Pattern p = Pattern.compile("([\\d]{1,3})(\\1)*");
java的写法。