繁体   English   中英

NetBIOS名称正则表达式

[英]NetBIOS Name Regular Expression

我有一个问题,根据此链接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匹配任何“单词”字符,即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次(包括)之间的先前表达匹配的量词。

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

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

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

另外,我认为你的正则表达式不会允许像abc这样的名字(特殊字符的多个部分,或者字母数字字符的两个部分)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM