.NET REGEX匹配匹配空字符串

时间:2011-09-06 22:00:38

标签: c# .net regex .net-4.0 match

我有这个

图案:

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

目标:

X=113.3413475 Y=18.2054775

我想匹配这些数字。它匹配像http://regexpal.com/和Regex Coach等测试软件中的find。

但是在Dot net和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]*"

任何人都知道为什么我得到所有这些空的比赛。

谢谢和问候, 凯文

6 个答案:

答案 0 :(得分:10)

是的,那将匹配空字符串。看看它:

[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

诚然,可能有更好的方法:

答案 1 :(得分:2)

另一个选择是保留原始的正则表达式,并断言它必须有一个数字(可能在一个点后):

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

转到:

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

答案 2 :(得分:1)

试试这个:

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

与Jon Skeet的答案略有不同,它与.45不匹配,它需要单独的数字(例如8)或实数十进制(例如8.1或{ {1}})

答案 3 :(得分:0)

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

将您的两个*更改为+,您就可以获得所需内容。

答案 4 :(得分:0)

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

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

答案 5 :(得分: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,.123,123.123等