我正在尝试将正则表达式与减法相结合,我只能像这样工作。 String regex = "[1-3[5-7]]";
,但需要带范围的不同类型的数字,同时也需要String regex = "\b([1-9]|[1-4][0-9]|5[0-5]&&[191])\b";
的并集。在这一行中,可以匹配1到55,也可以匹配191。它不起作用。任何人都可以给问题出在哪里的建议。我尝试了如下所示的数字范围。
public class NumericRangeRegex {
public String baseRange(String num, boolean up, boolean leading1) {
char c = num.charAt(0);
char low = up ? c : leading1 ? '1' : '0';
char high = up ? '9' : c;
if (num.length() == 1)
return charClass(low, high);
String re = c + "(" + baseRange(num.substring(1), up, false) + ")";
if (up) low++; else high--;
if (low <= high)
re += "|" + charClass(low, high) + nDigits(num.length() - 1);
return re;
}
private String charClass(char b, char e) {
return String.format(b==e ? "%c" : e-b>1 ? "[%c-%c]" : "[%c%c]", b, e);
}
private String nDigits(int n) {
return nDigits(n, n);
}
private String nDigits(int n, int m) {
return "[0-9]" + String.format(n==m ? n==1 ? "":"{%d}":"{%d,%d}", n, m);
}
private String eqLengths(String from, String to) {
char fc = from.charAt(0), tc = to.charAt(0);
if (from.length() == 1 && to.length() == 1)
return charClass(fc, tc);
if (fc == tc)
return fc + "("+rangeRegex(from.substring(1), to.substring(1))+")";
String re = fc + "(" + baseRange(from.substring(1), true, false) + ")|"
+ tc + "(" + baseRange(to.substring(1), false, false) + ")";
if (++fc <= --tc)
re += "|" + charClass(fc, tc) + nDigits(from.length() - 1);
return re;
}
private String nonEqLengths(String from, String to) {
String re = baseRange(from,true,false) + "|" + baseRange(to,false,true);
if (to.length() - from.length() > 1)
re += "|[1-9]" + nDigits(from.length(), to.length() - 2);
return re;
}
public String run(int n, int m) {
return "\\b0*?("+ rangeRegex("" + n, "" + m) +")\\b";
}
public String rangeRegex(String n, String m) {
return n.length() == m.length() ? eqLengths(n, m) : nonEqLengths(n, m);
}
}
答案 0 :(得分:0)
我认为您走错了路。您应该按照Patrick的建议,简单地提取并解析数值并以常规编程语言进行计算。
您仍然可以使用
这样的简单函数创建一个包装类,以帮助检查数字范围public static boolean between(int i, int minValueInclusive, int maxValueInclusive) {
return (i >= minValueInclusive && i <= maxValueInclusive);
}
Range<Integer> myRange = Range.between(1, 55);
if (myRange.contains(value)){
// do something
}
答案 1 :(得分:0)
根据条件,我尝试结合和减法的是'^(?! 250)0 *?([0-9] | 2(5([0-5])| [0-4] [0-9 ])| 1 [0-9] {2} | [1-9] [0-9] | 2000)$。在这种情况下,我们匹配1到255的范围和2000个数字(联合),并求和250(减去)。取反很好。