Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Xcode中POSIX正则表达式的奇怪结果_C++_Regex_Xcode_Posix - Fatal编程技术网

C++ Xcode中POSIX正则表达式的奇怪结果

C++ Xcode中POSIX正则表达式的奇怪结果,c++,regex,xcode,posix,C++,Regex,Xcode,Posix,我刚刚使用regex.h(跨平台)切换到内置的regex功能。对于以下简单的正则表达式,许多有效的输入,例如as@abc.com现在失败(其中ab@abc.com仍然可以正常工作): 呼叫代码为: return Common::regexMatch("^[^@\\s]+@[^@\\s]+\\.[^\\s\\.@]+$", userInput); 下面是实施: #import "regex.h" bool Common::regexMatch(const string& regex,

我刚刚使用regex.h(跨平台)切换到内置的regex功能。对于以下简单的正则表达式,许多有效的输入,例如as@abc.com现在失败(其中ab@abc.com仍然可以正常工作):

呼叫代码为:

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;   
}

令人困惑的是,当regex模式中根本没有字母规范时,它是基于不同的字母进行区分的。它对不喜欢的输入非常一致。TIA.

事实证明POSIX Extended不支持转义空格字符,但可以使用文字空格,因此我将所有“\s”替换为“”,它立即启动


有关更多信息,请参见

,因为您失败的是
s
,我想这是转义的问题。尝试将双反斜杠替换为单反斜杠。此外,不需要在字符类中转义句点。永远。嘿,谢谢你的快速回复,这非常有帮助。原来POSIX Extended不支持转义空格字符,但对文字空格也可以,所以我用“”替换了所有的“\\s”,它立即启动了!请注意,
\s
与单个空格的含义不同
\s
相当于
[\t\n\r]
。所以它匹配任何类型的空白。此外,请随意将问题的解决方案作为答案发布并接受。如果你自己发现了问题的话,这是完全正确的。我刚刚发现了这篇很棒的文章,它使用POSIX扩展语法,你不能在字符类中转义任何字符。
#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;   
}