匹配不等于

时间:2011-12-09 19:07:04

标签: c# regex

我正在尝试创建一个正则表达式,当遇到类似这样的事情时它将返回true:

MyField1 = 10293856

MyField1 = 72946392

数字字符串将始终是8位数的字符串。但是,我希望以下情况返回false。这是我唯一需要担心的情​​况,一串八个九。

MyField1 = 99999999

如何构建一个能为我做这个的正则表达式?

我希望表达式检查是否

MyField1 = xxxxxxxx

其中x是全部数字。但唯一不可能的是全部9个。

4 个答案:

答案 0 :(得分:3)

假设MyField1 = 10293856字符串出现在文件的一行上,这里有一个应该可以解决的正则表达式

if (Regex.IsMatch(text, 
    @"# Match 'var = 8digitval', where 8digitval is not all nines.
    ^                # Anchor to start of line.
    MyField1[ ]=[ ]  # Fixed literal var name & equals sign.
    (?!9{8}$)        # Assert value is not eight nines.
    [0-9]{8}         # Value is eight digits.
    $                # Anchor to end of line.
    ", 
    RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace)) {
    // Successful match
} else {
    // Match attempt failed
} 

上述正则表达式将匹配具有名为MyField1的硬编码变量的所有行。如果你想匹配其他变量名,(在等号周围有一个可变数量的空格),这个可能更符合你的要求:

if (Regex.IsMatch(text, 
    @"# Match 'var = 8digitval', where 8digitval is not all nines.
    ^           # Anchor to start of line.
    \w+\s*=\s*  # Variable var name & equals sign.
    (?!9{8}$)   # Assert value is not eight nines.
    [0-9]{8}    # Value is eight digits.
    $           # Anchor to end of line.
    ", 
    RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace)) {
    // Successful match
} else {
    // Match attempt failed
} 

答案 1 :(得分:2)

您不需要正则表达式。

public static bool Validate(string strNum)
{
    bool ret = false;
    Int32 num = 0;
    if (Int32.TryParse(strNum, out num))
    {
        if (num != 99999999)
        {
            ret = true;
        }
    }
    return ret;
}

你也可以让函数返回解析的int以及out参数或者返回。

答案 2 :(得分:0)

我假设你要从文本文件中解析这个?您的问题在输入的确切性质或您正在做的事情上有些不清楚。下面使用正则表达式在一行文本中查找名称和值,然后计算约束。

static void Main()
{
    const string Test = @"MyField1 = 10293856

MyField1 = 72946392 MyField1 = 99999999 MyField1 = 12356642“;

    Regex exp = new Regex(@"^(?<Name>\w+)\s*=\s*(?<Value>\d{8})\s*$", RegexOptions.Multiline);
    foreach(Match match in exp.Matches(Test))
    {
        string name = match.Groups["Name"].Value;
        string value = match.Groups["Value"].Value;

        if (value != "99999999")
        {
            Console.WriteLine("{0} = {1}", name, value);
        }
    }
}

这非常接近你可能会得到一个表达式,因为你找不到8位数字符串然后测试该值以查看它是否全部为9。

您也可以使用Linq表达式执行此操作:

    Regex exp = new Regex(@"^(?<Name>\w+)\s*=\s*(?<Value>\d{8})\s*$", RegexOptions.Multiline);
    foreach(Match match in exp.Matches(Test).OfType<Match>().Where(m => m.Groups["Value"].Value != "99999999"))
        ...

答案 3 :(得分:0)

^([0-8]\d{8})|(\d[0-8]\d{7})|(\d{2}[0-8]\d{6})|(\d{3}[0-8]\d{5})|(\d{4}[0-8]\d{4})|(\d{5}[0-8]\d{3})|(\d{6}[0-8]\d{2})|(\d{7}[0-8]\d{1})|(\d{8}[0-8])$