1

我创建了一个正则表达式来验证 -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

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

提前感谢您的回复。

怎样才能做到这一点?

4

3 回答 3

2

我创建了一个正则表达式来验证度数的方向,介于 -359 和 +359 之间

不,你不能。你不应该。您使用了错误的工具。正则表达式无法进行那种需要深入研究字符语义的验证。

正则表达式只能处理和匹配文本,但不能识别它们的实际含义。基本上,正则表达式对解析常规语言有好处,而对其他几乎所有东西都不好。

例如:

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

上述任务要求您理解文本的含义。正则表达式不能这样做

好吧,当然你肯定想出了一个正则表达式,但是你可以看到它非常不灵活。您的要求稍有改变,都会搞砸 - 正则表达式和您。

您应该更好地使用相应的语言功能 - 结构,例如if-else确保您正在阅读该范围内的学位,而不是正则表达式。

于 2013-07-30T14:22:10.573 回答
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
于 2013-07-30T14:23:26.037 回答
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})?)$

你可以在这里测试一下。

于 2013-07-30T14:17:56.027 回答