Vahid
Vahid

Reputation: 3442

C#: Find Unknown Character in a String

I have * strings and I want the only unknown character and its position. For instance, I want character 'a' or 'b' or 'c' or anything (unknown) and its positions in the strings below:

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

The strings are always have * characters. Sometimes I have 'a', sometimes 'n', sometimes 'x', and so on. I don't know what character coming inside stars (*).

How can I do this in C#?

Upvotes: 0

Views: 1856

Answers (6)

haim770
haim770

Reputation: 49095

Try this:

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

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

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

Please be aware that Single will throw an exception in case nothing found. Use it only when you're certain there's one (and only one) unknown character. If you're not sure use SingleOrDefault and check for Char.MinValue.

Upvotes: 3

Aaron Cronin
Aaron Cronin

Reputation: 2103

Here's a relatively novel yet understandable LINQ solution:

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 . . .

Upvotes: 0

d.moncada
d.moncada

Reputation: 17402

Here's a more primitive way:

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));
    }
}

Upvotes: 0

Peter
Peter

Reputation: 5728

How about this:

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

Upvotes: 0

Alex Zhukovskiy
Alex Zhukovskiy

Reputation: 10025

With regex

    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];
    }

with LINQ:

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

with multiple known chars:

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

Upvotes: 1

Lee Gary
Lee Gary

Reputation: 2397

You can use String.IndexOf to get the positions

Upvotes: 0

Related Questions