Regex.IsMatch返回True,这是不正确的

时间:2018-05-18 14:17:53

标签: c# regex

我有这样的扩展方法;

public static bool IsBoolean(this string value)
{
    string lower = value.ToLower(CultureInfo.InvariantCulture);
    return new Regex("[true]|[false]|[0]|[1]", RegexOptions.Compiled).IsMatch(lower);
}

但是当我将“fals”或“tru”作为值时,这种正则表达式模式会失败。如;

[Theory(DisplayName = "IsBoolean")]
[InlineData("FALS")]
[InlineData("Fals")]
[InlineData("TRU")]
[InlineData("Tru")]
public void IsNotBoolean(string value)
{
    bool result = value.IsBoolean();
    Assert.False(result);
}

所有这些测试都失败了。因为结果是真的 这怎么可能?这种正则表达式模式是错误的吗?

1 个答案:

答案 0 :(得分:2)

您想要检查字符串是否是以下任何一种,忽略大小写,

true
false
1
0

然后,您只需将这些字符串与|分开,并将其用作正则表达式,并使用IgnoreCase选项:

public static bool IsBoolean(this string value) {
    // note the ^ and $. They assert the start and end of the string.
    return new Regex("^(?:true|false|0|1)$", RegexOptions.IgnoreCase).IsMatch(value);
}

[]表示一个字符类,因此它将匹配其中的任何一个字符。 [abc]匹配 abc。注意区别。