将两位十进制数字添加到数字范围正则表达式中

时间:2013-07-30 14:16:00

标签: regex qt floating-point qregexp

我创建了一个Regexp来验证度数的方向,介于-359和+359之间(带有可选符号)。这是我的正则表达式:

const QString xWindDirectionPattern("[+-]{0,1}([0-9]{1,2}|[12][0-9]{2}|3[0-5][0-9])");

现在,我想添加两个十进制数字,以便将数字从-359.99写入+359.99。我尝试过附加\。[0-9] {1,2} | [0-9] {1,3},但它不起作用。

我想有可选的小数点,所以我可以

23.3   valid
23.33  valid
23     valid
23.333 not valid

我已经阅读了其他一些问题,例如this one,但我无法修改示例以匹配数字范围,就像我的情况一样。 我怎样才能达到这个结果?

提前感谢您的回复。

如何实现这一目标?

3 个答案:

答案 0 :(得分:2)

  

我创建了一个Regexp来验证度数的方向,介于-359和+359之间

不,你不能。你不应该。您使用的是错误的工具。正则表达式不能进行各种验证,这要求它深入研究字符的语义。

正则表达式只能处理和匹配文本,但无法识别它们的实际含义。基本上正则表达式对于解析常规语言很有用,而对几乎所有其他语言都很糟糕。

例如:

  • 正则表达式可以匹配3位数,但使用它来匹配范围内的3位数字[259, 634]是非常不切实际的。为此,您需要知道该数字中每个数字的含义。
  • 正则表达式可以匹配日期模式,例如 - \d\d/\d\d/\d\d,但无法识别哪个部分是date,哪个部分是month
  • 同样,它可以找到两个数字xy,但无论是x < y还是if-else都无法识别。

上述任务要求您了解文本的含义。 正则表达式无法做到

当然,你肯定会想出一个正则表达式,但正如你所看到的那样,它非常不灵活。你的要求稍有改变,就会把这两者都搞砸了 - 正则表达式和你。

您应该更好地使用相应的语言功能 - 像{{1}}这样的结构,以确保您正在读取该范围内的度数,而不是正则表达式。

答案 1 :(得分:1)

你可以这样做:

[+-]{0,1}((?:[0-9]{1,2}|[12][0-9]{2}|3[0-5][0-9])(?:\.[0-9]{1,2})?)

这将允许一个小数点后跟一个或两个数字。您可能还想使用开始和结束锚点(^ / $)来确保字符串中没有此模式以外的字符 - 如果没有,23.333将是允许,因为23.33符合上述模式:

^[+-]{0,1}((?:[0-9]{1,2}|[12][0-9]{2}|3[0-5][0-9])(?:\.[0-9]{1,2})?)$

您可以测试here

答案 2 :(得分:1)

尝试[+-]?([1-9]\d?|[12]\d{2}|3[0-5]\d)(\.\d{1,2})?

[+-]?          Optional Sign
[1-9]\d?       1 or 2 digit number
[12]\d{2}      100 to 299
3[0-5]\d       300 to 359
(\.\d{1,2})?   Optional decimal point followed by 1 or two digits