我有以下正则表达式:
^(MIN|MAX|SUM|AVERAGE):[(\\d+(\\.\\d+)?), ]+$
我试图实施的规则应该只允许以下格式的字符串:
OPERATION: (comma separated list of integers or real numbers)
例如,必须允许以下内容:
MIN: 7, 89.7, 67
AVERAGE: 67.9, 89, 9
但是,它接受表单的输入
MAX: ,
如何避免在逗号两侧出现空格以被接受?
正如您所尝试的那样,字符类不能包含正则表达式结构。
这与其他答案略有不同,导致正则表达式更小:
(MIN|MAX|SUM|AVERAGE): \\d+(\\.\\d+)?(, \\d+(\\.\\d+)?)*
不需要前导和尾随^-$它们是隐含的。
要使用:
if (str.matches("(MIN|MAX|SUM|AVERAGE): \\d+(\\.\\d+)?(, \\d+(\\.\\d+)?)*") {
// yes, format is OK
}
你可以使用这个正则表达式
^(MIN|MAX|SUM|AVERAGE):\s*\d+(\.\d+)?(\s*,\s*\d+(\.\d+)?)*$
这将接受您的任何“操作”、“:”符号和任何数字/点,以逗号分隔,在第一个数字之前或任何逗号之后有或没有空格。它还将防止您的行以逗号结尾。
Pattern pattern = Pattern.compile("^(MIN|MAX|SUM|AVERAGE):\\s?(\\d+?(\\.\\d+?)?,?\\s?)+?\\d$");
尝试
"^(MIN|MAX|SUM|AVERAGE)\\s?:\\s?(\\d+(\\.\\d+)?)(,\\s?\\d+(\\.\\d+)?)*$"
测试:
MIN:4: true
MIN:4,4: true
MIN:4, 5: true
MIN:4 , 5: false
MIN: 7, 89.7, 67: true
AVERAGE: 67.9, 89, 9: true
MAX: , : false
你的模式中有一个空格,所以你必须稍微调整一下,最快的改变就是这样,这样你的列表元素之间仍然可以有空格:
"^(MIN|MAX|SUM|AVERAGE):[(\d+(\.\d+)?)][(\d+(\.\d+)?), ]+$"