如何在 java 中编写字母数字范围检查器,它将检查给定的字母数字值是否在范围内。
例如:
输入:B3,范围:B1:B10 - true
B1、B1:B10 - 正确
B10、B1:B10 - 正确
B1、B3:B10 - 假
对于超过 1 位的数字,我的尝试失败了,例如 B3:B10,第二个前缀应该是“B”,num 应该是 10,但我得到了 B1 和 0。正则表达式有什么问题吗?
public class Main {
public static final String RANGE_PATTERN = "(.+)(\\d)+:(.+)(\\d)+";
public static final String INPUT_PATTERN = "(.+)(\\d)+";
public static final Pattern P1 = Pattern.compile(RANGE_PATTERN);
public static final Pattern P2 = Pattern.compile(INPUT_PATTERN);
public static void main(String[] args) {
System.out.println(checkWithInRange("B3:B10", "B7"));
}
public static boolean checkWithInRange(String range, String input) {
Matcher m1 = P1.matcher(range);
Matcher m2 = P2.matcher(input);
if (m1.find() && m2.find()) {
String prefix1 = m1.group(1);
String num1 = m1.group(2);
String prefix2 = m1.group(3);
String num2 = m1.group(4);
String inputPrefix = m2.group(1);
String inputNum = m2.group(2);
if (prefix1.equalsIgnoreCase(prefix2) && prefix2.equalsIgnoreCase(inputPrefix)) {
int n1 = Integer.parseInt(num1);
int n2 = Integer.parseInt(num2);
int n3 = Integer.parseInt(inputNum);
if (n3 >= n1 && n3 <= n2) {
return true;
}
}
}
return false;
}
}
最佳答案
使用 "(.+?)...
接收最短序列(不含数字)。或者更好的是 "(\\D+)...
。
使用 (\\d+)
而不是 (\\d)+
,以便 m.group(i)
是整个字符串位数。
无需对组使用空检查,也许您想要一个可选前缀:(\\D*)
。
您想要 find()
还是应该匹配整个字符串:matches()
?
关于java - 字母数字范围检查器 - B3 是否在 B1 中 :B10,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20658173/