C#:在字符串中查找未知字符

时间:2014-12-09 08:07:42

标签: c# string difference

我有*个字符串,我想要唯一的未知字符及其位置。例如,我想要字符“a”或“b”或“c”或任何(未知)及其在以下字符串中的位置:

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

字符串始终具有*个字符。有时我会有'a',有时是'n',有时是'x',依此类推。我不知道明星里面有什么角色(*)。

我如何在C#中执行此操作?

6 个答案:

答案 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 :(得分: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);
    }

答案 2 :(得分:0)

您可以使用String.IndexOf获取职位

答案 3 :(得分:0)

这个怎么样:

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

答案 4 :(得分: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));
    }
}

答案 5 :(得分: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 . . .