匹配不等于

本文关键字:不等于 | 更新日期: 2023-09-27 18:17:15

我试图使一个正则表达式,将返回true当它遇到这样的东西:

MyField1 = 10293856

MyField1 = 72946392

数字字符串总是8位的字符串。但是,我希望下面的情况返回false。这是我唯一需要担心的情况,一串8个9。

MyField1 = 99999999

我如何构造一个正则表达式来为我做这件事?

我想让表达式检查是否

MyField1 = xxxxxxxx

其中x都是数字。但唯一不可能是全9

匹配不等于

假设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
} 

你不需要正则表达式。

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参数或返回

我假设你正在解析这个文本文件?你的问题有点不清楚输入的确切性质,或者你在做什么。下面的代码使用Regex查找一行文本中的名称和值,然后计算约束。

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

MyField1 = 72946392MyField1 = 99999999MyField1 = 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"))
        ...
^([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])$