1

このリンク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;

あなたの助けは大歓迎です:)

4

2 に答える 2

2

正規表現はすべての文字列に一致します。これは、すべての量指定子が「1 つ以上の文字」 ( *) であり、文字列の開始と終了を探していないため、空の文字列にも一致します。^また、 1 組の角かっこ ( ) 内でエスケープされていないものを使用していますが(...|^|...、この位置が文字列の先頭でない限り、一致することはありません (上記で説明した量指定子が原因で発生する可能性があり*ます)。

ただし、あなたがしようとしていることを達成するのははるかに簡単です:

regex rgx("^[\\w!@#$%^()\\-'{}\\.~]{1,15}$");

C++11 を使用している場合は、読みやすくするために生の文字列を使用することもできます。

regex rgx(R"(^[\w!@#$%^()\-'{}\.~]{1,15}$)");

これは、選択した文字を少なくとも 1 つ (最大で 15 文字) 含むすべての有効な名前と一致する必要があります。

  • \wAZ、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回 (両端を含む)で一致させる量指定子です。

  • ^正規表現が文字列全体を埋めるように強制し$ます(最初と最後に一致するため)。
于 2014-06-07T08:43:30.803 に答える
1

ここを見てください: http://www.cplusplus.com/reference/regex/ECMAScript/ . そこには、特殊文字 (正規表現にとって特別な意味を持つ) について何かがあります。

たとえば、^は正規表現で特別な意味を持つため、エスケープする必要があります: \^. その他の特殊文字は次のとおり$ \ . * + ? ( ) [ ] { } |です。

また、あなたの正規表現はa-b-c(特殊文字の複数の部分、または英数字の3つ以上の部分)のような名前を許可しないと思います。

于 2014-06-07T08:44:58.977 に答える