【问题标题】:NetBIOS Name Regular ExpressionNetBIOS 名称正则表达式
【发布时间】:2023-04-09 16:05:01
【问题描述】:

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

您的帮助将不胜感激:)

【问题讨论】:

标签: c++ regex validation netbios


【解决方案1】:

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

实现您想要的目标要容易得多:

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 次(含)之间。

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

【讨论】:

  • 非常感谢您帮了我很多忙! :D 但我有一个问题 %^%()\\-'{}\\.什么是 % 是转义字符 % 和 \ 有什么区别?以及为什么您没有在 ) 和 { 之前放置转义字符?非常感谢 ! :)
  • 啊,额外的%是个错误。它不是转义字符(如果您好奇,仅适用于 Lua 中的正则表达式)。我只是偶然写了第二遍。我没有转义 [] 内的括号,仅仅是因为解析器能够注意到它仍在括号内,因此不能有任何特殊含义的括号,它们实际上只是字符。
  • 补充:您仍然需要转义具有特殊含义的字符,例如-(可以标记某个范围)和.(这是一个字符类)。使用 [a-z.] 本质上与 [.] 或只是 . 相同。
  • 您忘记了也允许使用的 & 字符
【解决方案2】:

看这里:http://www.cplusplus.com/reference/regex/ECMAScript/。您对特殊字符有一些了解(对于正则表达式具有特殊含义)。

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

另外,我认为您的正则表达式不允许使用像 a-b-c 这样的名称(特殊字符的多个部分,或字母数字字符的两个以上部分)。

【讨论】:

  • 据我所知,在组内不转义非类字符应该没问题,例如[()] 将匹配两个括号。唯一的例外是将^ 作为第一个字符。所以[x^][x\^] 应该都代表相同的表达式,但是[^x][\^x] 不明显的原因。
  • 至于答案的最后一部分:它们将被接受,因为表达式只是尝试匹配字符串的任何部分,即使它的长度为 0 个字符。由于匹配是贪婪的,因此在您的示例中它将匹配 a-b
猜你喜欢
  • 1970-01-01
  • 2011-05-11
  • 2019-08-09
  • 2010-09-21
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
相关资源
最近更新 更多