Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ NetBIOS名称正则表达式_C++_Regex_Validation_Netbios - Fatal编程技术网

C++ NetBIOS名称正则表达式

C++ NetBIOS名称正则表达式,c++,regex,validation,netbios,C++,Regex,Validation,Netbios,我有个问题 根据这个链接 ( 计算机名称最多可以是15个字母数字字符,不带空格。名称在网络上必须是唯一的,并且可以包含以下特殊字符: !@$%^&()-{}~ 不允许使用以下字符: \ * + = | : ; " ? < > , ) 我正在用C语言学习++ 所以我使用了下面的代码,但当我输入不允许的字符时..它是匹配的!为什么 regex rgx("[a-zA-Z0-9]*(!|@|#|$|%|^|&|\(|\)|-|_|'|.|~|\\{|\\})*[a-zA-Z0-9]*");

我有个问题 根据这个链接 ( 计算机名称最多可以是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(“[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}$)");