其他教程

其他教程

Products

当前位置:首页 > 其他教程 >

手机号码校验 正则表达式匹配有问题 C++11可以通过 android下匹配失败 SOS!

GG网络技术分享 2025-03-18 16:15 7


问题描述:

bool StringUtil::StringVerification(std::string src, std::string regular)
{
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)

regex pattern(regular.c_str());

if ( !regex_match( src, pattern ) )

{
return false;
}
return true;
#endif

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID||CC_TARGET_PLATFORM == CC_PLATFORM_IOS)

regex_t reg;
int retval = regcomp(&reg, regular.c_str(), REG_EXTENDED | REG_NEWLINE);

retval = regexec(&reg, src.c_str(), 0, NULL, 0);

CCLOG(\"%s is %s\\n\", regular.c_str(), retval == 0 ? \"legal\" : \"illegal\");

regfree(&reg);

if (retval == 0) {

return true;

}

else

{

return false;

}

#endif
}

测试用例:
StringUtil::StringVerification(strPhoneNum, \"^1\\d{10}$\");

跪求高手解答,为什么C语言的通不过呢???

网友观点:

try:

^1[0-9]{10}$

^1\\d{10}$

主要是不同语法下的转义字符等

C语言跟c++转义是一样的啊。。这个没有什么问题。。

厉害!!确实是转义字符的问题 但是我不知道怎么改
^[a-zA-Z0-9~!@#$%^&*()_+`\\-={}\\[\\]:\\\\\";\'<>?,.\\/]{%d,%d}$
这种的就有点蛋疼了

我已经搞定了!答案在这里!
http://blog.csdn.net/hanbingfengying/article/details/42613515

\\\"^1\\d{10}$\\\"这个 改成 \\\"^1\\d{10}$\\\" 应该就行了

打错了,改成 \\\"^1\\d{10}$\\\" 应该就行了

数据格式校验之正则表达式

前言

现如今随着互联网需求的不断发展,用户体验显得越来越重要,自然而然,系统的各项性能要求也越来越多,其中有一个体现系统稳定性的特性——系统的健壮性要求也是水涨船高。

作为一名开发人,我们对于健壮性的最大贡献就是要尽可能减少NPE(空指针)情况的出现,毕竟一旦系统出现NPE异常,前台便会收到500错误响应,极其影响用户体验,所以为了避免这种情况的出现,提升系统的健壮性,我们在实际业务中经常需要对前端的各种数据进行校验,一般我们都会用到if-else的方式,甚至更粗暴的方式,虽然有一种数据校验的方式即方便又很优雅,但在实际开发中却似乎并不受大家的青睐,今天我想把这种方式介绍给各位小伙伴。

正则表达式

正则表达式是一种匹配规则,被广泛应用在各种系统中,其本身与语言无关,除了javapython等语言支持外,linux更是原生支持正则表达式,甚至连我们日常用到的各种编辑器、IDE都是支持正则表达式的。当然,最重要的是在,掌握了这种技能,可以极大提升你的工作效率,让你工作更高效。好了,废话少说,我们先看下正则表达式的基本语法规则。

基本规则

以下规则来源菜鸟教程,网上也都能搜到。

非打印字符

非打印字符也可以是正则表达式的组成部分。下表列出了表示非打印字符的转义序列:

特殊字符

这里的特殊字符就是在正则表达式中有特殊含义中的字符,如果需要匹配特殊字符,需要进行转义

限定符

限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有*+?{n}{n,}{n,m} 共6种。

正则表达式的限定符有:

正则表达式应用

上面我们展示了正则表达式的一些基本匹配规则,接下来我们看下如何在我们的项目中使用正则表达式,完成我们的数据校验,这里我们主要是以java为例。

这里是我们的公用方法:

/**

*校验数据格式

*@parampattern正则格式

*@paramtargetStr目标值

*@return

*/

privatestaticbooleanpattern(Stringpattern,StringtargetStr){

Patterncompile=Pattern.compile(pattern);

Matchermatcher=compile.matcher(targetStr);

returnmatcher.matches();

}

方法的第一个入参是我们数据的正则表达式,后面是我们要校验的数据

匹配手机号

不知道各位小伙伴有没有好的手机号格式验证方法,反正我见到的除了直接强转成数字,就是正则表达式了,强转的过于暴力了。

Stringpattern="^\\\\d{11}";

Stringinput="13501234567";

System.out.println(pattern(pattern,input));

我们正则表达式的含义是匹配11位数字,更合理的表达式可以这样写:

Stringpattern="^[1]\\\\d{10}";

运行结果:

true

如果把输入的数据改成9位、12位,第一位不为1,或者包含非数字的其他字符,返回结果均为false

匹配日期

日期格式,我一直觉得是一个很难校验的数据,在日常开发中经常看到小伙伴用try-catch来校验,即直接转换成日期,如果转换失败就返回数据格式错误,但是这种方式不够优雅,过于暴力。

正则表达式才是数据校验yyds

Stringpattern2="^\\\\d{4}-\\\\d{1,2}-\\\\d{1,2}";

Stringinput2="2021-6-11";

System.out.println(pattern(pattern2,input2));

上面的正则表达式可以匹配2021-6-1或者2021-06-12这样的日期格式,当然对于2021-00-00这样的日期也是可以匹配的,这个日期格式在java中也是合法的日期,对应的日期是2020-11-30

是不是很方便也很简单,即优雅,又友好,它不香吗?

总结

正则表达式真的用起来很方便,比如批量替换啥的,用正则表达式,简直不要太方便,比如最流行的IDEA、常用的编辑器:

关于正则表达式的展示,就先分享这两个,其他的参照上面的规则,应该可以写出来,今天算是给大家校验数据提供一种思路,大家可以在自己的工作中用起来,毕竟正则表达式的应用太广泛了。好了,今天就到这里吧,各位小伙伴端午快乐。

- END -

标签:

提交需求或反馈

Demand feedback