是否与IndexOf()相反?也许NotIndexOf()?

时间:2013-12-17 23:00:51

标签: c#

如果 myStr 应该包含0和1,那么如何搜索此字符串以查找不是0或1的任何内容?

例如:

string myStr = "1001g101";

if (myStr.IndexOf(NOT "0") != -1 && myStr.IndexOf(NOT "1") != -1) {
    Console.Write("String contains something that isn't 0 or 1!");
}

我这样做的原因是不想做一个完整的ASCII字符映射并让它检查每个字符对所有的ASCII字符,这似乎效率太低。如果我必须检查每个角色并确保0或1,这将有效,但有更好的方法吗?

我对Regex并不擅长,但我怀疑这可能会得到我的回答。

4 个答案:

答案 0 :(得分:8)

或者使用LINQ:

if (myStr.Any(c => c != '0' && c != '1'))
    ....

答案 1 :(得分:3)

我会选择LINQ,就像Michael Gunter已经做了他的回答一样,但我会让它更复杂一点,以便更容易写/读更快:

var desiredCharacters = new HashSet<char>() { '0', '1' };
var input = "1011001010110";

if(input.Any(x => !desiredCharacters.Contains(x)))
{
    Console.WriteLine("Input string contains something that is not defined in desiredCharacters collection.");
}

我想说,较大的desiredCharacters集合可以让您获得更多的标准||比较效果。

由于您可以轻松修改desiredCharacters集合内容,因此您可以添加多个字符而无需额外的||,这会使整个内容的可读性降低。

修改

您可以使用All方法获得相同的结果:

if(!input.All(desiredCharacters.Contains))
{
    //(...)
}

答案 2 :(得分:2)

使用正则表达式。以下正则表达式模式应该可以解决这个问题

^[01]*$

示例代码为:

Match match = Regex.Match(myStr , @"^[01]*$");

if (!match.Success)
    Console.Write("String contains something that isn't 0 or 1!");

答案 3 :(得分:0)

你可以使用迭代,类似这样的东西,像O( m log n )那样运行,其中 m 是长度字符串s n 字符串chars的长度:

public static int NotIndexOf( this string s , string chars )
{
  char[] orderedChars = chars.ToCharArray() ;
  Array.Sort( orderedChars ) ;

  int index = -1 ;
  for ( int i = 0 ; index < 0 && i < s.Length ; ++i )
  {
    int p = Array.BinarySearch(orderedChars, s[i] ) ;
    if ( p < 0 )
    {
      index = i ;
    }
  }
  return index ;
}

使用正则表达式,您只需构造所需的负字符类。另一方面,除了构造负字符集外,它非常简单。这里我使用unicode代码点转义(\uXXXX)构建字符集,以避免必须处理在字符集(]的上下文中可能特殊的字符, ^-\仅限初学者。)

public static int NotIndexOf( this string s , string chars )
{
  StringBuilder regexString = new StringBuilder(3+6*chars.Length) ;
  regexString.Append("[^") ;
  foreach ( char c in chars.Distinct() )
  {
    regexString.AppendFormat( @"\u{0:X4}" , (ushort)c ) ;
  }
  regexString.Append("]") ;

  Regex rxCharSet = new Regex( regexString , Regex ) ;
  Match m         = rxCharSet.Match(s) ;

  return m.Success ? m.Index : -1 ;
}