【问题标题】:Add two decimal digits to a number range regex将两位小数添加到数字范围正则表达式
【发布时间】:2013-07-30 17:57:11
【问题描述】:

我创建了一个正则表达式来验证以度为单位的方向,介于 -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,但我无法修改示例以匹配数字范围,就像我的情况一样。 我怎样才能达到这个结果?

提前感谢您的回复。

如何做到这一点?

【问题讨论】:

    标签: regex qt floating-point qregexp


    【解决方案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。

    【讨论】:

    • 我可以写359.88,但我也可以写,比如6334,但是在这种情况下不允许小数点。
    • @Jepessen 我认为整个想法是支持 -359.99 和 359.99 之间的范围。为什么会允许 6334?
    • 事实上我是说我也可以写6334,但我不应该被允许。
    • @Jepessen 好的,感谢您解决这个问题。您可能会看到,因为它匹配 6334 内的 63。请参阅我关于使用开始和结束锚点的说明 (^ / $)。我的第二种模式根本不允许6334。
    • 我刚刚尝试过,它允许我写入无效值,如 99999。我检查了一下,如果我在我的范围内写入一个值,它工作得很好,但我也可以写入一个值超出范围,在这种情况下不允许使用小数。
    【解决方案2】:

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

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

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

    例如:

    • Regex 可以匹配 3 位数字,但使用它来匹配范围内的 3 位数字是极其不切实际的 - [259, 634]。为此,您需要知道该数字中每个数字的含义。
    • Regex 可以匹配日期模式,例如 - \d\d/\d\d/\d\d,但它无法识别哪一部分是 date,哪一部分是 month。
    • 同样,它可以找到你两个号码x和y,但它无法识别x < y与否。

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

    嗯,当然,您肯定想出了一个正则表达式,但正如您所见,它非常不灵活。对您的要求稍作改动,都会搞砸正则表达式和您。

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

    【讨论】:

    • 我在插入后验证数字,但我想这样做,因为我有一个网格单元格,我必须在其中放置这个值,我必须创建一个验证器以避免用户写写入时出现错误数据,例如插入字母或输入无效值。我认为正则表达式是一个很好的工具,但也许你可以提出更好的建议?
    • @Jepessen。好吧,您可以通过正则表达式进行某种验证,例如,测试用户没有任何字母表,只需要数字,或者字段应该以特定字母开头,只包含给定集合中的字符,并且应该是指定的长度。但是像我说的一些验证无法识别数字的range。您应该为此使用适当的语言结构。顺便说一句,您使用的是什么语言?
    • 另见 this 和 this 帖子。
    【解决方案3】:

    试试[+-]?([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
    

    【讨论】:

    • 它似乎不起作用。我可以写 1、12、2。但不能写 2.4、200 ecc
    • 将正则表达式放入Regex Pal,它匹配我能扔给它的所有东西。
    • 我不知道该说什么...可能是与QRegExp和QRegExpValidator有关的问题?
    • 这是可能的,从外观上看,您也遇到了 p.s.w.g 的正则表达式的问题。
    • 好的。我会尝试在 Qt 论坛中查看它,如果我有任何消息,请返回这里。
    猜你喜欢
    • 2015-01-02
    • 1970-01-01
    • 2016-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    相关资源
    最近更新 更多