[英]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}
是与a和b次(包括)之间的先前表达匹配的量词。
^
和$
将强制正则表达式填充整个字符串(因为它们将匹配开头和结尾)。 请看这里: http : //www.cplusplus.com/reference/regex/ECMAScript/ 。 你有一些关于特殊字符的东西(具有正则表达式的特殊含义)。
例如, ^
在正则表达式中有特殊含义,因此必须将其转义: \\^
。 其他特殊字符是: $ \\ . * + ? ( ) [ ] { } |
$ \\ . * + ? ( ) [ ] { } |
。
另外,我认为你的正则表达式不会允许像abc
这样的名字(特殊字符的多个部分,或者字母数字字符的两个部分)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.