0

我在为我的 grails 应用程序的考试评级字段编写正确的正则表达式时遇到问题。用户应该可以选择输入字母字符或数字。定量评分应在 0-100 之间,接受带或不带百分号 (%) 的小数,但不包括负数。正则表达式应仅允许特殊字符百分比 (%) 和句点 (.)。下面是一组可能的输入:

1) 100% (should pass the validation)
2) 100.0 (should pass the validation)
3) PASSED (should pass the validation)
4) FAILED (should pass the validation)
5) 100.1 (should not pass the validation)
6) -90 (should not pass the validation)

您的回答将不胜感激。

谢谢!

4

2 回答 2

2

我假设语言是Java。我还假设您要验证用户输入,它只包含百分比

"^\\s*((100(\\.0*)?|\\d{1,2}(\\.\\d*)?|\\.\\d+)%?|PASSED|FAILED)\\s*$"

(在 Groovy 中,您不必转义反斜杠)

/^\s*((100(\.0*)?|\d{1,2}(\.\d*)?|\.\d+)%?|PASSED|FAILED)\s*$/ (for Groovy)

上面的正则表达式只会验证 0.0 到 100.0 之间的数字。它允许小数点后的任意长位数,并且还允许通过.8或等情况45.,因为它们可以被处理。正则表达式还允许在输入之前和之后(但不是内部)有任意数量的空格。

编辑

要匹配纯文本 (ASCII):

"^\\s*((100(\\.0*)?|\\d{1,2}(\\.\\d*)?|\\.\\d+)%?|[a-zA-Z.]+)\\s*$"

/^\s*((100(\.0*)?|\d{1,2}(\.\d*)?|\.\d+)%?|[a-zA-Z.]+)\s*$/ (for Groovy)

这将匹配使用英文字母字符(不区分大小写)和全句点的文本。例如sdhSDFHS.sfSDJF.sdfSDJFI将匹配上面的正则表达式。请注意,当前的正则表达式不允许文本中包含空格,但如果要添加更多字符,请在方括号内添加(字符类)[a-zA-Z.]:. 查看文档以获取更多详细信息。

测试代码(Java)

String arr[] = {"100%", "  .435%", "3%", "0%", "0", ".0", "hdfjs.", "  PASSED", "FAILED", "34.5  ", "sdhf.sdfdsf.fsdf  ", " 100.0000 ", "-234.4", "-0.1", "34.", "100.0000001", "1000"};
for (String s: arr) 
    System.out.println(s + " " + (s.matches("^\\s*((100(\\.0*)?|\\d{1,2}(\\.\\d*)?|\\.\\d+)%?|[a-zA-Z.]+)\\s*$") ? "matched" : "not matched"));

输出

100% matched
  .435% matched
3% matched
0% matched
0 matched
.0 matched
hdfjs. matched
  PASSED matched
FAILED matched
34.5   matched
sdhf.sdfdsf.fsdf   matched
 100.0000  matched
-234.4 not matched
-0.1 not matched
34. matched
100.0000001 not matched
1000 not matched

编辑2

讨论中提到的要求更改:仅匹配从 1.0 到 100.0 的百分比:

/^\s*((100(\.0*)?|[1-9]\d?(\.\d*)?)%?|[a-zA-Z.]+)\s*$/ (for Groovy)

这个条件比以前更严格,因为01.1不会匹配。如果你想匹配这种情况:

/^\s*(0*((100(\.0*)?|[1-9]\d?(\.\d*)?)%?)|[a-zA-Z.]+)\s*$/ (for Groovy)
于 2012-06-15T03:38:08.653 回答
1

100.1 没有意义。但是,对于其余部分,您可以使用

^\d+\)\s*(PASSED|FAILED|0*(100(\.0+)?|[0-9]{1,2}(\.\d+)?)%?)$
于 2012-06-15T03:32:12.333 回答