2011-09-06 212 views
3

我有这个.NET正则表达式匹配匹配空字符串

模式:

[0-9]*\.?[0-9]* 

目标:

X=113.3413475 Y=18.2054775 

,我想匹配的数字。它与http://regexpal.com/和Regex Coach等测试软件匹配。

但在点网和http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx

我得到:

Found 11 matches: 

1. 
2. 
3. 
4. 
5. 
6. 113.3413475 
7. 
8. 
9. 
10. 18.2054775 
11. 

String literals for use in programs: 

C# 
    @"[0-9]*[\.]?[0-9]*" 

任何一个有为什么我得到所有这些空匹配任何想法。

感谢和问候, 凯文

+0

使某些东西是强制性的。 –

回答

9

是的,这将匹配空字符串。看看吧:

[0-9]* - zero or more digits 
\.? - an optional period 
[0-9]* - zero or more digits 

一切都是可选的,所以一个空字符串匹配。

这听起来像你总是希望这是数字某处,例如:

[0-9]+\.[0-9]*|\.[0-9]+|[0-9]+ 

(这里的顺序是有意义的,因为你希望它采取的最可能的)

那工作对我来说:

using System; 
using System.Text.RegularExpressions; 

class Test 
{ 
    static void Main(string[] args) 
    { 
     string x = "X=113.3413475 Y=18.2054775"; 
     Regex regex = new Regex(@"[0-9]+\.[0-9]*|\.[0-9]+|[0-9]+"); 
     var matches = regex.Matches(x); 
     foreach (Match match in matches) 
     { 
      Console.WriteLine(match); 
     } 
    } 
} 

输出:

113.3413475 
18.2054775 

有可能是这样做的更好的办法,固然:)

+0

我认为@“[0-9] + [\。] [0-9] +”将适用于他的情况。 –

+1

@ Cubicle.Jockey:在“123”,“123”等情况下会失败。或“.123” - 我相信所有这些都是OP想要的。 –

+0

我觉得很好。通过我的测试运行你的后,它很好。 +1 –

0

的关键问题是*,这意味着“匹配前面字符的零个或多个”。空字符串匹配零个或多个数字,这就是为什么你会得到所有这些匹配。

将您的两个* s更改为+ s,您将得到您想要的。

0

这个正则表达式的问题在于它在所有字段中是完全可选的,所以一个空字符串也与它匹配。我会考虑增加所有的情况。通过正则表达式,我看到你想要的数字有无点,有或没有一组十进制数字。您可以先将那些仅包含数字[0-9]+,然后包含数字加上一个点的那些,[0-9]+\.分开,然后用|(或)将它们全部加入。

用,因为它是正则表达式的问题是,它允许不是实数的情况下,例如,案件中的第一组数字最后一组数字是空的(只是一个点) ,所以你必须明确地放置有效的案例。

1

试试这个:

[0-9]+(\.[0-9]+)? 

这是略有不同的是乔恩斯基特在这个问题的答案也不会匹配.45,单打独斗,需要一个数字(例如,8)或真实小数(如8.10.1

0
Regex pattern = new Regex(@"[0-9]+[\.][0-9]+"); 

string info = "X=113.3413475 Y=18.2054775"; 

MatchCollection matches = pattern.Matches(info); 

int count = 1; 
foreach(Match match in matches) 
{ 
    Console.WriteLine("{0} : {1}", count++, match.Value); 
} 

//output 
//1 : 113.3413475 
//2 : 18.2054775 

将您的*替换为+并删除?从你的期间情况。

编辑:从上面的对话:@“[0-9] +。[0-9] * |。[0-9] + | [0-9] +”,是更好的情况。捕捉123,0.123,123.123等

+0

哇猜我应该在发布之前刷新..... :)耶他们说什么。 你可以在linqpad中运行我的例子。 –

2

另一种选择是保留原来的正则表达式,只是断言它必须有它的(也许一个点之后)的数字:

[0-9]*\.?[0-9]* 

业大:

(?=\.?[0-9])[0-9]*\.?[0-9]*