2011-04-21 247 views
2

我使用C#和.NET,我有一个正则表达式看起来像这样正则表达式数字字符和& -

"\D" 

所有非数字字符,但是我不想匹配到匹配小数点(。)和负号( - )。我如何用正则表达式来做到这一点?

所以,我想克里斯,它它的工作做了一些调整,使:

(我用‘原始’的名称的文本框)

private void Original_TextChanged(object sender, EventArgs e) { 
     Regex regex = new Regex(@"[^\d.-]", RegexOptions.IgnoreCase); 
     Match match = regex.Match(Original.Text); 
     if (match.Success) { 
      Original.Text = regex.Replace(Original.Text, ""); 
      Original.SelectionStart = Original.TextLength; 
     } 
    } 

Original.SelectionStart = Original.TextLength;是因为每当它被替换它把选择开始,这似乎有点怪异的用户...

回答

5

您可以使用negated character class排除号码.-。匹配像这样的单个字符的表达式是[^\d\.\-]。该脱字号表示班级被否定。

Regex.IsMatch("a f", @"^[^\d\.\-]+$"); // true 
Regex.IsMatch("a_f", @"^[^\d\.\-]+$"); // true 
Regex.IsMatch("a.f", @"^[^\d\.\-]+$"); // false 
Regex.IsMatch("af-", @"^[^\d\.\-]+$"); // false 
Regex.IsMatch("-42", @"^[^\d\.\-]+$"); // false 
Regex.IsMatch("4.2", @"^[^\d\.\-]+$"); // false 
+2

实际上没有必要在该位置处转义'-':也可以完美地使用'[^ ​​\ d \ .-]'。 – mousio 2011-04-21 22:51:44

+1

@mousio:是的!好点,虽然我总是警惕这样做:)我猜,愚蠢的迷信。 – 2011-04-21 22:55:06

+2

有没有必要逃避点。请记住括号内的字符类与正则表达式的其余部分有几乎完全不同的语法。 '[^ \ d .-]'实际上可以工作。也就是说,很难责怪人们逃离HYPHEN-MINUS,因为它和脱字号对于是否需要逃脱才能消除它们的(正常)魔法是非常敏感的。 – tchrist 2011-04-21 22:59:31