【问题标题】:Java limit user input with regexJava 使用正则表达式限制用户输入
【发布时间】:2021-09-04 09:10:42
【问题描述】:

我需要限制用户输入罗马数字的算术运算。 唯一可能的输入是 [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

谢谢!

【问题讨论】:

  • 那是因为这里的最后一部分 V?I{0,3} 匹配可选的 V 和 0-3 倍的 I 使得整个部分都是可选的。

标签: java regex roman-numerals


【解决方案1】:

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

注意将-放在字符类的末尾,否则它将匹配一个范围+-/


您可以添加另一个替代项以匹配 I II 和 III 并且不要将 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

【讨论】:

    【解决方案2】:

    您的正则表达式中的数字部分略有错误,因为它接受空字符串:(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})

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-20
      • 2016-02-26
      • 1970-01-01
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      • 1970-01-01
      • 2017-11-09
      相关资源
      最近更新 更多