2010-03-26 9 views

ответ

11
Regex RgxUrl = new Regex("[^a-z0-9]"); 
        blnContainsSpecialCharacters = RgxUrl.IsMatch(stringToCheck); 
+9

У вас пропустили A-Z .. – Manish

+1

это примет 'à', это специальный символ для OP? (конечно, это не так, ОП уже принял ответ) –

35

Использование String.IndexOfAny:

private static readonly char[] SpecialChars = "[email protected]#$%^&*()".ToCharArray(); 

... 

int indexOf = text.IndexOfAny(SpecialChars); 
if (indexOf == -1) 
{ 
    // No special chars 
} 

Конечно, это будет цикл внутри - но, по крайней мере, вы не должны делать это в вашем коде.

+0

Эй, Джон, как вы будете реализовывать мнение Байка? – Manish

+0

@Manish: Учитывая, что у вас, вероятно, будет широкий диапазон символов для белого списка, регулярное выражение - это, вероятно, путь. –

10

Вместо проверки, если строка содержит «специальные символы» часто лучше, чтобы проверить, что все символы в строке являются «обычными» символами, другими словами, используйте белый список вместо черного списка. Причина в том, что существует много символов, которые можно было бы назвать «особыми символами», и если вы попытаетесь перечислить их все, что вы обязательно пропустите.

Так что вместо того, чтобы делать то, что вы просили, лучше проверить, например, что ваша строка соответствует регулярному выражению @"^\w+$" или что вам нужно.

+1

Ницца мысль ... !! – Manish

+3

@Bubblewrap: Я предложил использовать регулярное выражение с белым списком. Это не правильный ответ на вопрос? Проблема с методом черного списка - это бит, где он пишет «и т. Д.». Компьютеры не могут догадаться, что вы имеете в виду, и написать список всех специальных символов - это неправильный подход к решению этой проблемы. –

+0

IMO не является. Не зная мотивации вопроса, вы не можете сказать, что использование белого списка является лучшей (или даже действительной) альтернативой использованию IndexOfAny. И вопрос был, как я прочитал, особенно о черных списках. – Bubblewrap

-1

Использование PHP, вы можете попробовать:

if (preg_match("[^A-Za-z0-9]", $yourString) { 
    //DO WHATEVER 
} 

Это возвратит TRUE, если строка содержит ничего, кроме буквы или цифры.

Надеюсь, это поможет.

+4

Вопрос помечен C#. –

+2

Не в C#, но все же дал мне необходимое регулярное выражение. :) – Manish

+0

@Manish: Ну, это * a * regex - но не тот, который точно соответствует вопросу. Если бы вы сказали: «Я просто хочу включать буквенно-цифровые символы, а не акценты и т. Д.», Тогда это было бы другим вопросом. –

-1

Также ...

foreach (char character in "some*[email protected]#@!#string") 
     { 
      if(!Char.IsLetterOrDigit(character)) 
      { 
       //It is a special character. 
      } 
     } 
+2

-1, в частности, сказано в вопросе БЕЗ ИСПОЛЬЗОВАНИЯ LOOP ... – Manish

0
public static bool HasSpecialCharacters(string str) 
{ 
    string specialCharacters = @"%[email protected]#$%^&*()?/>.<,:;'\|}]{[_~`+=-" +"\""; 
    char[] specialCharactersArray = specialCharacters.ToCharArray(); 

    int index = str.IndexOfAny(specialCharactersArray); 
    //index == -1 no special characters 
    if (index == -1) 
    return false; 
    else 
    return true; 
} 
1

Я пытался добиться другого результата. Чтобы создать метод, который возвращает специальный символ, используемый для разделения определенной строки, скажем, 1 # 4 # 5, чтобы затем использовать его для разделения этой же строки. Поскольку система, которую я поддерживаю, построена множеством разных людей, и в некоторых случаях я понятия не имею, что такое шаблон (обычно их нет), мне многое помогло. И я пока не могу проголосовать.

public String Separator(){ 
     **String specialCharacters = "%[email protected]#$#^&*()?/>.<:;\\|}]{[_~`+=-" +"\"";** 
     char[] specialCharactersArray = specialCharacters.toCharArray(); 
     char[] a = entrada.toCharArray(); 
     for(int i = 0; i<a.length; i++){ 
      for(int y=0; y < specialCharactersArray.length; i++){ 
       if(a[i] == specialCharactersArray[y]){ 
        separator = String.valueOf(specialCharactersArray[y]); 
       } 
      } 
     } 
     return separator; 
    } 

Спасибо, ребята.

1
//apart from regex we can also use this 
string input = Console.ReadLine(); 
      char[] a = input.ToCharArray(); 
      char[] b = new char[a.Length]; 
      int count = 0; 
      for (int i = 0; i < a.Length; i++) 
      { 
       if (!Char.IsLetterOrDigit(a[i])) 
       { 
        b[count] = a[i]; 
        count++; 
       } 
      } 
      Array.Resize(ref b, count); 
      foreach(var items in b) 
      { 
       Console.WriteLine(items); 
      } 
      Console.ReadLine(); 
//it will display the special characters in the string input 
3

Вот краткое решение для проверки специальных символов с помощью LINQ

private bool ContainsSpecialChars(string value) 
{ 
     var list = new[] {"~", "`", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "+", "=", "\""}; 
     return list.Any(value.Contains); 
} 
4

Linq это новый черный.

string.Any(c => char.IsSymbol(c)); 

Для IsSymbol(), действительные символы являются членами UnicodeCategory.

  • Буквоподобные символы, которые включают в себя набор математических буквенно-цифровых символов, а также символов, таких как ℅, № и ™
  • Количество форм, таких как верхние и нижние индексы
  • Математические операторы и стрелки
  • Геометрические символы
  • Технические символы
  • узоры
  • Брайля
  • Dingbats

Edit:

Это не поймать все символы. Это может дополнять:

string.Any(c => !char.IsLetterOrDigit(c)); 
Смежные вопросы