2014-12-09 4 views
0

У меня есть * строки, и я хочу единственный неизвестный символ и его положение. Например, я хочу символ «a» или «b» или «c» или что-нибудь (неизвестно) и ее позиции ниже строки:C#: Найти Неизвестный символ в строке

1) "******a***" // I want 'a' 
2) "b****"  // I want 'b' 
3) "*******c" // I want 'c' 

Строки всегда * символы. Иногда у меня есть «a», иногда «n», иногда «x» и т. Д. Я не знаю, какой персонаж попадает в звезды (*).

Как это сделать в C#?

+0

Я не понимаю. Вы хотите, чтобы все символы 'a',' b', 'c' отображались? Что вы имеете в виду от _unknown character_ точно? Это только для '*'? Было бы лучше, если бы вы уточнили свой вопрос. –

+0

Где были проблемы, когда вы пытались это достичь? – Reniuz

+0

Я только что редактировал вопрос для лучшего понимания. –

ответ

2

Попробуйте это:

// the string 
var str = "******a***"; 

// the character 
var chr = str.Single(x => x != '*'); 

// the position 
var pos = str.IndexOf(chr); 

Пожалуйста, обратите внимание, что Single сгенерирует исключение в случае, если ничего не найдено. Используйте его только тогда, когда вы уверены, что есть один (и только один) неизвестный персонаж. Если вы не уверены в использовании SingleOrDefault и проверьте наличие null.

1

С регулярным выражением

public static char GetUnknownChar(string s, char knownChar) 
    { 
     const string mask = "[^{0}]"; 
     var match = Regex.Match(s, string.Format(mask, knownChar)); 
     return match.Value[0]; 
    } 

с LINQ:

public static char GetUnknownChar(string s, char knownChar) 
    { 
     return s.First(c => c != knownChar); 
    } 

с несколькими известными гольцами:

public static char GetUnknownChar(string s, IEnumerable<char> knownChars) 
    { 
     var knownSet = new HashSet<char>(knownChars); 
     return s.First(knownSet.Contains); 
    } 
0

Как об этом :

string foo = "**x*"; 
char[] knownChars = new char[]{'*','!','?'}; 
int i = 0; 
for (; i < foo.Length; i++) 
    if (knownChars.Contains(foo[i])) 
     break; 
0

Вот более примитивный способ:

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     FindUnknown("******a***"); 
     FindUnknown("b****"); 
     FindUnknown("*******c"); 
    } 

    private static void FindUnknown(string myString) 
    { 
     var tag = '*'; 
     var unknown = ' '; 
     var unknownIndex = -1; 

     var currentIndex = 0; 
     foreach (var character in myString) 
     { 
      if (character != tag) 
      { 
       unknown = character; 
       unknownIndex = currentIndex; 
       break; 
      } 
      currentIndex++; 
     } 

     Console.WriteLine(String.Format("Unknown character: {0}", unknown)); 
     Console.WriteLine(String.Format("Unknown character index: {0}", unknownIndex)); 
    } 
} 
0

Вот относительно роман еще понятно решение LINQ:

var strings = new[] {"******a***", "b****", "*******c"}; 

foreach (var str in strings) 
{ 
    var prefix = str.TakeWhile(c => c.Equals('*')); 
    var postPrefixIndex = prefix.Count(); 
    var unknownCharacter = str[postPrefixIndex]; 

    Console.WriteLine("{0} at {1}", unknownCharacter, postPrefixIndex); 
} 

// a at 6 
// b at 0 
// c at 7 
// Press any key to continue . . . 
Смежные вопросы