我有这个
图案:
[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]*"
任何人都知道为什么我得到所有这些空的比赛。
谢谢和问候, 凯文
答案 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等