我终究无法理解为什么以下正则表达式无法匹配 4 个 float 。 这些 float 的书写方式有一些规则。
- float 范围从0到1
- 如果第一个数字是 0,你可以跳过它
- 句号后的位数不限。
这些是有效的 float
- 1
- 1.0
- 0.0
- .0
- 0.123
- .123
现在是我尝试过的代码
string input = " 0 0 0 .4";
string regex = @"[0-1]*(\.[0-9]*)*\s[0-1]*(\.[0-9]*)*\s[0-1]*(\.[0-9]*)*\s[0-1]*(\.[0-9]*)*";
Regex r = new Regex(regex, RegexOptions.Compiled);
Match m = r.Match(input);
m.Value 返回“0 0 0”,而我希望它返回“0 0 0 .4”
我试过了
[0-1]{0,1}(\.[0-9]*)*\s[0-1]{0,1}(\.[0-9]*)*\s[0-1]{0,1}(\.[0-9]*)*\s[0-1]{0,1}(\.[0-9]*)*
同样,但看起来 .net 不能很好地处理 {0,1} 语法(或者我只是用错了)
我试过查看 http://www.regular-expressions.info/reference.html并且 {0,1} 至少应该对我的理解有效。
我设法制作了一个与我可以使用的小正则表达式匹配器工具中的字符串匹配的正则表达式,但该正则表达式不适用于 .net Regex 类
更新
我将正则表达式与 Tokenizer 结合使用来解析更大的文档。
结合 Pavel Minaev 和 psasik 编写的以下正则表达式进行了预期的匹配
([0,1]|([0,1]?\.[0-9]+))\s([0,1]|([0,1]?\.[0-9]+))\s([0,1]|([0,1]?\.[0-9]+))\s([0,1]|([0,1]?\.[0-9]+))
下面匹配实际的 float
([0,1]|([0,1]?\.[0-9]+))
请您参考如下方法:
对于初学者来说,您的正则表达式通常是错误的 - 由于过度使用 *,它会很乐意匹配 10101.10101.10101 之类的内容。
您的特殊匹配结果的原因是因为您的输入字符串以空格 "" 字符开头。因此比赛是这样的:
- 第一个
[0-1]*匹配开头的空字符串 - 第一个
(\.[0-9]*)*匹配空字符串“跟随”该空字符串 - 第一个
\s匹配输入中的起始空格字符 - second
[0-1]*匹配输入中的 first0... - third
\s匹配输入中的third 空格字符(第三个0之前的那个)
实际上没有组匹配任何内容(或者更确切地说,它们都匹配空字符串,因为您使用 *)。
