我创建了一个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,但我无法修改示例以匹配数字范围,就像我的情况一样。 我怎样才能达到这个结果?
提前感谢您的回复。
如何实现这一目标?
答案 0 :(得分:2)
我创建了一个Regexp来验证度数的方向,介于-359和+359之间
不,你不能。你不应该。您使用的是错误的工具。正则表达式不能进行各种验证,这要求它深入研究字符的语义。
正则表达式只能处理和匹配文本,但无法识别它们的实际含义。基本上正则表达式对于解析常规语言很有用,而对几乎所有其他语言都很糟糕。
例如:
[259, 634]
是非常不切实际的。为此,您需要知道该数字中每个数字的含义。 \d\d/\d\d/\d\d
,但无法识别哪个部分是date
,哪个部分是month
。x
和y
,但无论是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