Java 使用正则表达式限制用户输入

Java limit user input with regex

我需要限制用户输入罗马数字的算术运算。 唯一可能的输入是 [I to X][+-/*][I to X].

这就是我所拥有的:

boolean correctRoman = operation.matches("^(X|IX|IV|V?I{0,3}) ?[+-/*] ?(X|IX|IV|V?I{0,3})$")

不同输入的结果:

"III"  //false
"III + "  //true-WHY??
"III + X"   //true as it should be

谢谢!

在模式的这一部分 (X|IX|IV|V?I{0,3}) 中,由于问号和量词 {0,3} 允许匹配 "III + "

,因此整个最后一个备选方案是可选的

注意把-放在字符class的末尾,否则会匹配一个范围+-/


您可以添加另一个替代项来匹配 I IIIII,并且不要将 V 设为可选。

^(X|IX|IV|VI{0,3}|I{1,3}) ?[+/*-] ?(X|IX|IV|VI{0,3}|I{1,3})$
  • ^ 字符串开头
  • (X|IX|IV|VI{0,3}|I{1,3})匹配罗马数字10、9、4、5-8和1-3
  • ?[+/*-] ? 匹配可选空格之间的字符之一
  • (X|IX|IV|VI{0,3}|I{1,3})与第一部分相同的数字
  • $ 字符串结束

Regex demo

您的正则表达式中的数字部分略有错误,因为它接受空字符串:(X|IX|IV|V?I{0,3})V?I{0,3} 表示 0 或 1 V,以及 0 到 3 I。因此,0 V 和 0 I 是有效的(空字符串)。

试试 (X|IX|IV|VI{0,3}|I{1,3})