【发布时间】:2018-06-27 23:02:10
【问题描述】:
我正在寻找一个正则表达式来验证以下模式:
ABC
注意:这里的 ABC 不是正则表达式,而是用于简单地描述问题
有
Block | Accepted values |
------+------------------------------+
A | Any number between 1 and 11 |
B | , or - or | |
C | Any number between 1 and 11 |
评论
-
,: 列举了一些确切的值 -
-: 表示范围 -
|:一个值或另一个 - 这些符号可以混合使用(例如
2,3 | 1-9 | 10-11)
示例
有效表达式
1
9,10
9,10,11|1-5
1-11
8|10
1|3|7
etc..
无效的表达式
0
20
9,10,15
1-19
1|12
1|11,
etc..
试过
public class RuleTest {
String A = "[1-9]|1[0-1]";
String B = "[\\,\\-\\|]";
String C = "[1-9]|1[0-1]";
Pattern RULE_DROP_DIGIT = Pattern.compile(A+"|"+A+B+C);
@Test
public void mustPassRuledropdigitPatternTest() {
assertTrue(RULE_DROP_DIGIT.matcher("1").matches());
assertTrue(RULE_DROP_DIGIT.matcher("1-9").matches());
assertTrue(RULE_DROP_DIGIT.matcher("10-11").matches());
assertTrue(RULE_DROP_DIGIT.matcher("1|9").matches());
assertTrue(RULE_DROP_DIGIT.matcher("10|11").matches());
assertTrue(RULE_DROP_DIGIT.matcher("1,9").matches());
assertTrue(RULE_DROP_DIGIT.matcher("10,11").matches());
assertTrue(RULE_DROP_DIGIT.matcher("9,10,11|1-5").matches());
assertTrue(RULE_DROP_DIGIT.matcher("3|5|7").matches());
}
@Test
public void mustFailRuledropdigitPatternTest() {
assertTrue(catchedAssertionError(RULE_DROP_DIGIT, ""));
assertTrue(catchedAssertionError(RULE_DROP_DIGIT, " "));
assertTrue(catchedAssertionError(RULE_DROP_DIGIT, "0"));
assertTrue(catchedAssertionError(RULE_DROP_DIGIT, "14"));
assertTrue(catchedAssertionError(RULE_DROP_DIGIT, "1--9"));
assertTrue(catchedAssertionError(RULE_DROP_DIGIT, "1--19"));
assertTrue(catchedAssertionError(RULE_DROP_DIGIT, "10--11"));
assertTrue(catchedAssertionError(RULE_DROP_DIGIT, "1||9"));
assertTrue(catchedAssertionError(RULE_DROP_DIGIT, "1||19"));
assertTrue(catchedAssertionError(RULE_DROP_DIGIT, "10||11"));
assertTrue(catchedAssertionError(RULE_DROP_DIGIT, "1,,9"));
assertTrue(catchedAssertionError(RULE_DROP_DIGIT, "1,,19"));
assertTrue(catchedAssertionError(RULE_DROP_DIGIT, "10,,11"));
assertTrue(catchedAssertionError(RULE_DROP_DIGIT, "0,1"));
assertTrue(catchedAssertionError(RULE_DROP_DIGIT, "12"));
assertTrue(catchedAssertionError(RULE_DROP_DIGIT, "8,"));
assertTrue(catchedAssertionError(RULE_DROP_DIGIT, ",8"));
}
/*
* Catch AssertionError
*/
private boolean catchedAssertionError(Pattern code, CharSequence input) {
try {
assertTrue(code.matcher(input).matches());
return false;
} catch (AssertionError e) {
// NOTHING
}
return true;
}
}
问题
- 我的正则表达式有什么问题?
- 什么是正确的?
EDIT1:更正了 A、B EDIT2:添加注释
【问题讨论】:
-
有点奇怪
A = "[1-9]|[1-9]1[0-1]"- 为什么是第二个[1-9]? -
抱歉打错了。最初是
[1-9]|1[0-1]。已更正。谢谢! -
你说你想匹配模式 ABC 但似乎你允许 A 和 ABCBCBC。您要匹配的高级结构是什么?如果要允许任意数量的 B,为什么要区分 A 和 C?
-
在您必须通过的模式测试中,很少有无效输入,例如 3|5|7 、9,10,11|1-5 甚至数字 19。这些预计会通过吗?
-
@HeyStackExchange,也许是
A(BA)*?根据 RegExp 运算符优先级,A|ABC+指定序列(A、ABC、ABCC、ABCCC、...)。