Regex 如何限制QLineEdit中的表达式

Regex 如何限制QLineEdit中的表达式,regex,qt,validation,qlineedit,Regex,Qt,Validation,Qlineedit,我需要一个QLineEdit,它必须表示一个范围。 F.E.(1,2),对于这种表示,我想为用户设置一个验证检查器,以避免写入其他符号。 在本例中,我有char+int+char+int+char,如下例所示。 Qt是否具有处理此问题的功能? 提前感谢。编写只接受有效范围的regexp是不可能的,原因是您可以检查语法,但不能检查数值(除非e regexp引擎有一些扩展名) [1234,5678) 及 不是在语法上(regexp是关于什么的),而是在语义上(regexp没有那么强大) 用于检查r

我需要一个QLineEdit,它必须表示一个范围。 F.E.(1,2),对于这种表示,我想为用户设置一个验证检查器,以避免写入其他符号。 在本例中,我有char+int+char+int+char,如下例所示。 Qt是否具有处理此问题的功能?
提前感谢。

编写只接受有效范围的regexp是不可能的,原因是您可以检查语法,但不能检查数值(除非e regexp引擎有一些扩展名)

[1234,5678)

不是在语法上(regexp是关于什么的),而是在语义上(regexp没有那么强大)

用于检查regexp可以使用的语法

\[\d+,\d+\)
或者,如果还允许其他类型的间隔边界条件:

[\[)]\d+,\d+[\])]

我建议不要允许所有字符,只允许需要的字符。例如:

QRegExp("[\\\\\\(\\)\\{\\}]\\d[\\\\\\(\\)\\{\\}]\\d[\\\\\\(\\)\\{\\}]");
我会解释:

[]这些字符包含char:\\\的匹配字符(这实际上与\符号匹配,因为您需要对正则表达式\进行一次转义,对Qt字符串进行一次转义,使其\\)\(用于开头括号等。您可以添加所有要匹配的字符。正则表达式备忘单对此很有帮助

\d与一个数字匹配,如果要有多个数字,可以使用\d+表示至少一个数字,或\d{3}表示正好三个数字。(+1或更多、-0或1、*0或更多)

另一个例子是:

QRegExp("[\\\\\\(\\)\\{\\}]\\d[,\\.]\\d[\\\\\\(\\)\\{\\}]");
要使中心字符成为.或符号,可以使用Qt的功能来实现此目标

以下代码段将限制您指定的行编辑上的输入

QRegExp re("^[[,(]{1,1}(0|[1-9]{1,1}[0-9]{0,9})[,]{1,1}(0|[1-9]{1,1}[0-9]{0,9})[],)]{1,1}$");
QRegExpValidator *validator = new QRegExpValidator(re, this);
ui->lineEdit->setValidator(validator);
编辑 更新了正则表达式

QRegExp expr("^[[,(]{1,1}(0|[1-9]{1,1}[0-9]{0,9})[,]{1,1}(0|[1-9]{1,1}[0-9]{0,9})[],)]{1,1}$");

这就是我想要的!我必须允许多个前导0-s。

在我看来,输入字段不允许您键入一些字符是一个可怕的想法(接近在矩形中捕捉鼠标移动)。请注意,许多用户在不看键盘的情况下无法键入,因此他们会键入禁止输入的字符,稍后他们会很惊讶这些字符不存在,并再次键入整个内容(仍然不看屏幕)。如果内容无效,最好在字段附近显示一条消息。我不想接受有效的范围,我想接受有效的语法。这意味着char int char int char在这种情况下,我可以写入000002222,但您不能允许写入超过一个前导0的消息。正确的是“^[,(]{1,1}(0 |[1-9]{1,1}[0-9]{0,9}[,]{1,1}(0 |[1-9]{1,1}])[0-9]{0,9}][],)]{1,1}$“以后是否需要
删除
验证程序?@TomášZato代码段中没有显示它,但“this”参数正在设置*parent参数,这将在父对象是QObject时启用自动资源清理(请参阅)
QRegExp expr("^[[,(]{1,1}(0|[1-9]{1,1}[0-9]{0,9})[,]{1,1}(0|[1-9]{1,1}[0-9]{0,9})[],)]{1,1}$");