在 C++ 專案中使用正則表達式驗證手機號碼,代碼在 Windows 平台(C++11 std::regex)運行正常,但在 Android 平台(POSIX regex.h)卻無法匹配。
bool StringUtil::StringVerification(std::string src, std::string regular) {
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
std::regex pattern(regular.c_str());
return std::regex_match(src, pattern);
#elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
regex_t reg;
int retval = regcomp(®, regular.c_str(), REG_EXTENDED | REG_NEWLINE);
retval = regexec(®, src.c_str(), 0, NULL, 0);
regfree(®);
return retval == 0;
#endif
}
測試用例:StringUtil::StringVerification(strPhoneNum, "^1\\d{10}$");
Windows 上使用 C++11 std::regex 支持 \d 元字符,而 Android/iOS 使用的 POSIX 正則引擎(regex.h)不支持 \d,只識別 [0-9] 或 [[:digit:]]。
將正則表達式修改為跨平台兼容寫法:
// 修改前
"^1\\d{10}$"
// 修改後
"^1[0-9]{10}$"
或使用 POSIX 字符類:"^1[[:digit:]]{10}$"。
\d、\w 等非標準元字符。[0-9]、[a-zA-Z0-9_] 等顯式字符類。