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
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})
与第一部分相同的数字
$
字符串结束
您的正则表达式中的数字部分略有错误,因为它接受空字符串:(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})
我需要限制用户输入罗马数字的算术运算。 唯一可能的输入是 [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
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})
与第一部分相同的数字$
字符串结束
您的正则表达式中的数字部分略有错误,因为它接受空字符串:(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})