我正在寻找一个正则表达式来验证以下模式:
ABC
注意:ABC不是这里的regExp,而是用来简单描述问题的
使用
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:添加了笔记
答案 0 :(得分:1)
您将无法使用正则表达式检查范围的左手边小于或等于右手边。
说:
^(?:0*(?:1[01]|[1-9]))(?:[,\-|]0*(?:1[01]|[1-9]))*$
来自
String A = "(?:0*(?:1[01]|[1-9]))";
String B = "[,\\-|]";
Pattern.compile("^" + A + "(?:" + B + A + ")*$");
派生:
A | Any number between 1 and 11 |
0*(?:1[01]|[1-9])
B | , or - or | |
[,\-|]
C | Any number between 1 and 11 |
0*(?:1[01]|[1-9])
使用您的原始代码:
String A = "[1-9]|[1-9]1[0-1]";
第二个[1-9]
将导致该数字不匹配10或11,但是将匹配110和911之间的许多数字。
此外,请注意,如果未明确匹配^...$
(例如,使用.find()
而不是.matches()
),则先拥有[1-9]
只会使其与匹配。 '1'
中的第二11
。
Pattern RULE_DROP_DIGIT = Pattern.compile(A+"|"+A+B+C);
A
,B
和C
不加括号,因此"|"
与|
中的A
处于同一级别
解决此问题的一种方法是添加括号。
Pattern RULE_DROP_DIGIT = Pattern.compile("(?:"+A+")|(?:"+A+B+C+")");