如果 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并不擅长,但我怀疑这可能会得到我的回答。
答案 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 ;
}