C++ NetBIOS名称正则表达式
我有个问题 根据这个链接 ( 计算机名称最多可以是15个字母数字字符,不带空格。名称在网络上必须是唯一的,并且可以包含以下特殊字符: !@$%^&()-{}~ 不允许使用以下字符: \ * + = | : ; " ? < > , ) 我正在用C语言学习++ 所以我使用了下面的代码,但当我输入不允许的字符时..它是匹配的!为什么C++ NetBIOS名称正则表达式,c++,regex,validation,netbios,C++,Regex,Validation,Netbios,我有个问题 根据这个链接 ( 计算机名称最多可以是15个字母数字字符,不带空格。名称在网络上必须是唯一的,并且可以包含以下特殊字符: !@$%^&()-{}~ 不允许使用以下字符: \ * + = | : ; " ? < > , ) 我正在用C语言学习++ 所以我使用了下面的代码,但当我输入不允许的字符时..它是匹配的!为什么 regex rgx("[a-zA-Z0-9]*(!|@|#|$|%|^|&|\(|\)|-|_|'|.|~|\\{|\\})*[a-zA-Z0-9]*");
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(“[a-zA-Z0-9]*(!|@| |$|%| ^和| \(| | \)-| | | | | | | |][a-zA Z0-9]*”;
字符串名;
cin>>名称;
if(regex_匹配(名称,rgx))
{
cout正则表达式将匹配任何字符串,因为您的所有量词都是“无字符或多字符”(*
),并且由于您不寻找字符串的开头和结尾,所以即使是空字符串也会匹配。此外,您在一对括号((…|^ | |…
)中使用了未替换的^
),它将永远不会匹配,除非此位置是字符串的开头(这可能是由于上面解释的*
量词引起的)
但是,要实现您想要实现的目标要容易得多:
regex rgx("^[\\w!@#$%^()\\-'{}\\.~]{1,15}$");
如果您使用的是C++11,那么最好使用原始字符串以提高可读性:
regex rgx(R"(^[\w!@#$%^()\-'{}\.~]{1,15}$)");
这应该匹配所有包含至少一个(最多15个)选定字符的有效名称
\w
匹配任何“单词”字符,即A-Z、A-Z、数字和下划线(并且根据您的区域设置和正则表达式引擎,可能还包括umlauts和重音字符)。因此,在上述表达式中,最好实际将其替换为A-Za-Z\d
:
regex rgx("^[A-Za-z\\d_!@#$%^()\\-'{}\\.~]{1,15}$");
或:
{a,b}
是一个量词,它匹配a和b次(包括a和b次)之间的先前表达式
^
和$
将强制正则表达式填充整个字符串(因为它们将匹配开头和结尾)
看这里:。这里有一些关于特殊字符的信息(对于正则表达式有特殊的含义)
例如,^
在正则表达式中有特殊含义,因此必须对其进行转义:\^
。其他特殊字符是:$\.*+?()[]{}
此外,我认为您的正则表达式不允许使用像a-b-c
(特殊字符的多个部分,或字母数字字符的两个以上部分)这样的名称。据我所知,在组中不转义非类字符是可以的,例如[()]
将匹配两个括号。唯一的例外是将^
作为第一个字符。因此[x^]
和[x^]
都应表示相同的表达式,但[^x]
和[^x]
出于明显的原因,请不要这样做。至于答案的最后一部分:它们将被接受,因为表达式只会尝试匹配字符串的任何部分,即使它的长度为0个字符。因为匹配是贪婪的,所以在您的示例中它将匹配a-b
。感谢您的帮助:)谢谢你帮了我这么多!:D但是我有一个问题%^%()\-'{}\\\。什么是%是转义字符%和\?为什么你以前没有放转义字符)和{?非常感谢!:)啊,额外的%
是个错误。它不是转义字符(如果你好奇的话,只适用于Lua中的正则表达式)。我只是偶然地写了第二次。我没有逃过[]中的括号
原因很简单,因为解析器能够注意到它仍然在括号内,因此不可能有任何特殊意义的括号,它们实际上只是字符。要添加:您仍然必须转义具有特殊意义的字符,如-
(可以标记某些范围)和
(这是一个字符类)。使用[a-z.]
基本上与[.]
相同,或者只是
。您忘记了同样允许使用的符号和字符。请注意:不会更正示例方法中的其他错误:NetBIOS名称“
”和“-
“从第一个或最后一个角色。
regex rgx(R"(^[A-Za-z\d_!@#$%^()\-'{}\.~]{1,15}$)");