验证程度和字符(正则表达式)

时间:2014-07-09 11:08:32

标签: regex qregexp input-mask

我需要从QLineEdit验证给定的字符串。 真实输入: 355.12°L

双号必须在0-360之间,最后一个字符必须是L或R. 我已经使用了QString mask for degree(°)和this example for 360但是我不能同时使用mask和QDoubleValidator。看起来只有QRegExp才能解决这个问题。

我的面具字符串:

">999.99°A"

2 个答案:

答案 0 :(得分:1)

((?:[012]?[0-9]{1,2}|3(?:[0-5][0-9]|60))(?:\.[0-9]{0,2})?)°[LR]

尝试以上模式。我不确定qregexp是否支持(?:)模式。

答案 1 :(得分:1)

我建议的模式是故意冗长且冗余,以尽可能提高效率(目标是尽可能减少正则表达式引擎的工作)

QRegExp exp("^(?:[1-2][0-9]{0,2}(?:\\.[0-9]{1,2})?|3(?:[0-5]?[0-9]?(?:\\.[0-9]{1,2})?|60(?:\\.00?)?)|[4-9][0-9]?(?:\\.[0-9]{1,2})?|0(?:\\.[0-9]{1,2})?)° ?[LR]$");
lineEdit_->setValidator(new QRegExpValidator(exp, this));

此模式禁止前导零为数十和数百,并使可选小数限制为两位数(因此,不允许尾随或前导点) °L (或R

之间允许使用可选空格

现在,如果你需要一个完全符合掩码999.99°A的模式(即前导零是正确的,任何地方都没有可选空格,总有三位数和两位小数),你可以使用这个模式而不是前一个:

^(?:[0-2][0-9]{2}\\.[0-9]{2}|3(?:[0-5][0-9]\\.[0-9]{2}|60\\.00))°[LR]$