gpt4 book ai didi

c++ - NetBIOS 名称正则表达式

转载 作者:行者123 更新时间:2023-11-30 02:45:52 25 4
gpt4 key购买 nike

我有一个问题根据此链接 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;

非常感谢您的帮助:)

最佳答案

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

尽管如此,实现您想要的目标要容易得多:

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

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

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

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

  • \w 匹配任何“单词”字符,即 A-Z、a-z、数字和下划线(并且根据您的语言环境和正则表达式引擎,可能还包含变音符号和重音字符)。因此,最好在上面的表达式中用 A-Za-z\d_ 替换它:

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

    或者:

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

  • ^$ 将强制正则表达式填充整个字符串(因为它们会匹配开头和结尾)。

关于c++ - NetBIOS 名称正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24095272/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com