1

根据此链接 http://support.microsoft.com/kb/188997我有一个问题 (计算机名称最多可以包含 15 个字母数字字符,不能有空格。名称在网络上必须是唯一的,并且可以包含以下内容特殊字符:!@#$%^&()-_'{}.~

不允许使用以下字符:\ * + = | : ; " ? < > , )

我正在用 C++ 开发

所以我使用了以下代码但是当我输入不允许的字符时..它匹配!为什么 ?

 regex  rgx("[a-zA-Z0-9]*(!|@|#|$|%|^|&|\(|\)|-|_|'|.|~|\\{|\\})*[a-zA-Z0-9]*");


string name;
    cin>>name;

if (regex_match(name, rgx))
{
    cout << " Matched :) " << endl;
}
else
    cout << "Not Matched :(" << endl;

对你的帮助表示感谢 :)

4

2 回答 2

2

您的正则表达式将匹配任何字符串,因为您的所有量词都是“一个或多个字符”(*),并且由于您不是在寻找字符串的开头和结尾,因此您甚至可以匹配空字符串。此外,您^在一对括号 ( (...|^|...) 中使用了未转义的字符,这将永远不会匹配,除非此位置是字符串的开头(这可能是由于*如上所述的量词而发生的)。

但是,实现您想要实现的目标要容易得多:

regex rgx("^[\\w!@#$%^()\\-'{}\\.~]{1,15}$");

如果您使用的是 C++11,您不妨使用原始字符串以获得更好的可读性:

regex rgx(R"(^[\w!@#$%^()\-'{}\.~]{1,15}$)");

这应该匹配包含至少一个(最多)15 个选定字符的所有有效名称。

  • \w匹配任何“单词”字符,即 AZ、az、数字和下划线(根据您的语言环境和正则表达式引擎,可能还包括元音变音和重音字符)。A-Za-z\d_因此,在上面的表达式中实际替换它可能会更好:

    regex rgx("^[A-Za-z\\d_!@#$%^()\\-'{}\\.~]{1,15}$");
    

    或者:

    regex rgx(R"(^[A-Za-z\d_!@#$%^()\-'{}\.~]{1,15}$)");
    
  • {a,b}是在ab次(包括)之间匹配先前表达式的量词。

  • ^并将$强制正则表达式填充整个字符串(因为它们将匹配开头和结尾)。
于 2014-06-07T08:43:30.803 回答
1

看这里:http ://www.cplusplus.com/reference/regex/ECMAScript/ 。那里有一些关于特殊字符的东西(对于正则表达式有特殊含义)。

例如,^在正则表达式中具有特殊含义,因此您必须对其进行转义:\^. 其他特殊字符有:$ \ . * + ? ( ) [ ] { } |.

另外,我认为您的正则表达式不允许使用诸如a-b-c(特殊字符的多个部分,或字母数字字符的两个以上部分)之类的名称。

于 2014-06-07T08:44:58.977 回答