.NET REGEX匹配匹配空字符串

本文关键字:字符串 REGEX NET | 更新日期: 2023-09-27 18:08:01

我有这个

图案:

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

目标:

X=113.3413475 Y=18.2054775

我想匹配这些数字。它与测试软件中的发现相匹配,如http://regexpal.com/和Regex教练。

但在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]*"

任何人都知道我为什么会得到这些空火柴。

感谢和问候,Kevin

.NET REGEX匹配匹配空字符串

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

[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-9]+('.[0-9]+)?

与Jon Skeet的答案略有不同,因为它与.45不匹配,它需要一个单独的数字(例如8(或一个实十进制(例如8.10.1(

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

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

转到:

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

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

把你的两个*换成+,你就会得到你想要的。

这个正则表达式的问题是它在所有字段中都是完全可选的,所以它也匹配一个空字符串。我会考虑添加所有的case。通过正则表达式,我看到你想要带点或不带点的数字,以及带或不带一组十进制数字的数字。您可以先分离那些只包含数字[0-9]+的,然后分离那些只含有数字加一个点[0-9]+'.的,然后用|(或(将它们全部连接起来。

regex的问题是,它允许非实数的情况,例如,第一组数字最后一组数字为空(只有一个点(的情况,因此必须显式放置有效的情况。

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等