我正在寻找regexp表达式来验证以下模式:
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:添加注释
发布于 2018-06-27 14:13:59
您将无法使用正则表达式检查范围的左侧小于或等于右侧。
尽管如此:
^(?: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_
0*(?:1[01]|[1-9])B-或-或
[,\-|]C\x{e76f}1至11之间的任何数字
0*(?:1[01]|[1-9])在您的原始代码中:
字符串A=“1-9\1-910-1”;
第二个[1-9]将导致这与10或11不匹配,但将匹配110到911之间的许多数字。
另外,当没有显式匹配^...$ (例如使用.find()而不是.matches())时,首先拥有[1-9]将导致它只匹配11中的第二个'1'。
模式RULE_DROP_DIGIT =Pattern.compile(A+“AC.26”+A+B+C);
A、B和C没有括号,因此"|"与A中的|处于同一级别。
解决这一问题的一种方法是添加括号。
Pattern RULE_DROP_DIGIT = Pattern.compile("(?:"+A+")|(?:"+A+B+C+")");https://stackoverflow.com/questions/51064914
复制相似问题