9

無効な文字がないか文字列を確認したいと思います。無効な文字とは、そこにあるべきではない文字を意味します。これらは何のキャラクターですか?これは違いますが、それほど重要ではないと思います。重要なのは、それをどのように行うべきか、そしてそれを行うための最も簡単で最良の方法(パフォーマンス)は何ですか?

'AZ'、'empty'、'。'、'$'、'0-9'を含む文字列が必要だとします。

したがって、「 HELLO STaCKOVERFLOW 」のような文字列がある場合は、「a」が原因で無効になります。さて、それを行う方法は?を作成し、List<char>許可されていないすべての文字をその中に入れて、このリストで文字列を確認することができます。当時はたくさんの文字があったので、たぶん良い考えではありません。しかし、許可されたすべての文字を含むリストを作成することはできますか?その後?文字列内のすべての文字について、List<char>?を比較する必要があります。このためのスマートコードはありますか?そして別の質問:AZを追加する場合、List<char>手動で25文字を追加する必要がありますが、これらの文字はASCIIテーブルで65〜90とわかっているので、簡単に追加できますか?助言がありますか?ありがとうございました

4

4 に答える 4

21

これには正規表現を使用できます。

Regex r = new Regex("[^A-Z0-9.$ ]$");
if (r.IsMatch(SomeString)) {
    // validation failed
}

から文字のリストを作成するには、A-Zまたは0-9単純なループを使用します。

for (char c = 'A'; c <= 'Z'; c++) {
    // c or c.ToString() depending on what you need
}

ただし、正規表現ではそれは必要ありません。ほとんどすべての正規表現エンジンが範囲構文(A-Z)を理解しています。

于 2012-09-10T11:33:15.540 に答える
0

このような関数と、必要に応じて最初と最後の文字を制限する拡張バージョンを作成したばかりです。元の関数は、文字列が有効な文字のみで構成されているかどうかをチェックするだけです。拡張関数は、最初と最後の文字をチェックするときにスキップされるリストの先頭にある有効な文字の数に2つの整数を追加します。実際には、単に呼び出します。元の関数を3回実行します。以下の例では、文字列が文字で始まり、アンダースコアで終わらないようにします。

StrChr(String, "_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"));
StrChrEx(String, "_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", 11, 1));


BOOL __cdecl StrChr(CHAR* str, CHAR* chars)
{
 for (int s = 0; str[s] != 0; s++)
 {
     int c = 0;

    while (true)
    {
        if (chars[c] == 0)
        {
             return false;
        }
         else if (str[s] == chars[c])
         {
            break;
         }
        else
         {
            c++;
         }
     }
 }

return true;
}

BOOL __cdecl StrChrEx(CHAR* str, CHAR* chars, UINT excl_first, UINT excl_last)
{
char first[2]   = {str[0], 0};
char last[2]    = {str[strlen(str) - 1], 0};

if (!StrChr(str, chars))
{
    return false;
}

if (excl_first != 0)
{
    if (!StrChr(first, chars + excl_first))
    {
        return false;
    }
}

if (excl_last != 0)
{
    if (!StrChr(last, chars + excl_last))
    {
        return false;
    }
}

return true;
}
于 2013-09-07T21:48:40.343 に答える
0

c#を使用している場合は、Listandcontainsを使用してこれを簡単に行うことができます。これは、(文字列内の)単一文字またはまったく同じ複数文字の文字列で行うことができます

  var pn = "The String To ChecK";      
  var badStrings = new List<string>()
  {
  " ","\t","\n","\r"
  };
  foreach(var badString in badStrings)
  {
    if(pn.Contains(badString))
    {
     //Do something
    }
  }
于 2020-05-27T20:09:08.467 に答える
0

正規表現があまり得意でない場合は、C#でこれを行う別の方法があります。これは、notifNameという名前の文字列変数をテストするために作成したコードのブロックです。

var alphabet = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z";
var numbers = "0,1,2,3,4,5,6,7,8,9";
var specialChars = " ,(,),_,[,],!,*,-,.,+,-";
var validChars = (alphabet + "," + alphabet.ToUpper() + "," + numbers + "," + specialChars).Split(',');
for (int i = 0; i < notifName.Length; i++)
{
    if (Array.IndexOf(validChars, notifName[i].ToString()) < 0) {
        errorFound = $"Invalid character '{notifName[i]}' found in notification name.";
        break;
        }
}

必要に応じて、配列に追加された文字を変更できます。Array IndexOfメソッドは、全体の鍵です。もちろん、コンマを有効にしたい場合は、別の分割文字を選択する必要があります。

于 2021-11-18T15:05:32.023 に答える