2011-12-09 63 views
-4

我试图做一个正则表达式将返回true,当它遇到这样的事情:匹配不等于

MyField1 = 10293856 

MyField1 = 72946392 

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

MyField1 = 99999999 

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

我想表达,以检查是否

MyField1 = xxxxxxxx 

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

+4

您希望只有在看到字符串“MyField1 = 99999999”时才返回false? – CanSpice

+0

领先的零 - 好或坏? –

+0

'99999999'究竟有什么问题?这是确切的字符串吗? 8位重复数字?或任何数量的重复数字?你需要提供你正在寻找的实际模式。 – Brandon

回答

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

+0

这是一个非常强大的解决方案。但是,它会拒绝0099999999这可能是运营商想要的,但没有具体要求。 –

+0

我认为OP正试图从文本中提取8位数字 –

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 
} 
+0

我不知道你可以这么做:(?!9 {8} $)#断言值不是八个九。 –

0

我假设你解析了这一点文本文件的?您的问题对于输入的确切性质或您正在做的事情有点不清楚。以下内容使用Regex在文本行中查找名称和值,然后评估约束。

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")) 
     ... 
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])$