regex.h (クロスプラットフォーム) を使用して組み込みの正規表現機能に切り替えました。また、次の単純な正規表現では、as @abc.comなどの多くの有効な入力が失敗するようになりました ( ab@abc.comは引き続き正常に動作します)。
^[^@\s]+@[^@\s]+\.[^\s\.@]+$
呼び出しコードは次のとおりです。
return Common::regexMatch("^[^@\\s]+@[^@\\s]+\\.[^\\s\\.@]+$", userInput);
そして、実装は次のとおりです。
#import "regex.h"
bool Common::regexMatch(const string& regex, const string& text) {
//return [[NSString stringWithCString:text.c_str() encoding:NSUTF8StringEncoding] isMatchedByRegex:[NSString stringWithCString:regex.c_str() encoding:NSUTF8StringEncoding]];
regex_t re = {0};
if (regcomp(&re, regex.c_str(), REG_NOSUB | REG_EXTENDED | REG_ICASE) != 0)
return false;
int status = regexec(&re, text.c_str(), (size_t)0, NULL, 0);
regfree(&re);
if (status != 0)
return false;
return true;
}
正規表現パターンに文字仕様がまったく含まれていないのに、別の文字に基づいて識別しているのは不可解です。そして、どの入力が気に入らないかについては非常に一貫しています。ティア。