【发布时间】:2023-04-04 23:10:01
【问题描述】:
我正在尝试检测模式:
字符串 "BP" 后跟 2 个或 4 个双精度值(我稍后要捕获),全部由空格分隔。
例如:
BP 1.0 3.5BP -1e-3 0.72 3.7 1.22e2
为了检测 double,我使用了从 here 获得的模式 [+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?。
不幸的是,在测试了几个字符串后,我发现我的代码无法区分字符串 BP 后跟 2 个或 4 个数字。这是一些测试用例:
void Main()
{
var testString = "BP -1.23e4 5.67";
var mspaces = @"\s*"; // meaning as many spaces as you want
var cdouble = @"([+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?)"; // meaning capture a double
var shortPattern = String.Join("", mspaces, "BP", mspaces, cdouble, mspaces, cdouble, mspaces);
var longPattern = String.Join("", mspaces, "BP", mspaces, cdouble, mspaces, cdouble, mspaces, cdouble, mspaces, cdouble, mspaces);
var bpShort = Regex.Match(testString, shortPattern, RegexOptions.IgnoreCase);
var bpLong = Regex.Match(testString, longPattern, RegexOptions.IgnoreCase);
if (bpLong.Success)
{
Console.WriteLine("Long pattern detected"); // !!FALSE-MATCH!!
}
if (bpShort.Success)
{
Console.WriteLine("Short pattern detected");
}
}
在此示例中,即使只有两个数字(-1.23e4 和 5.67),代码也会匹配 4 个不同的数字(-1.23e4、5.、6、7)
也许我错误地添加了括号来表示我想要捕获所有数字子元素,或者我是否应该进一步指出双端以空格或字符串结尾,我不知道?
【问题讨论】:
-
看起来像非贪婪匹配。
-
附带说明,如果您的分隔符为空,您可以使用
string.Concat而不是Join。 -
为什么不直接匹配
cdouble模式,看看你得到2个还是4个匹配?