我正在尝试将一个字符串与另一个字符串匹配,以使两者之间至少有 3 个字符匹配。我的字符串的长度应为 4,全部大写,3 个字母和 1 个介于 0 和 10 之间的数字(不包括 0 和 10)。例如:RM5Z 我怎样才能以最简化的形式在 java 中做到这一点?
问问题
848 次
2 回答
4
要检查字符串的形式,您可以使用此^(?=[A-Z]*[1-9][A-Z]*$).{4}$
正则表达式
^.{4}$
将确保长度 4^(?=[A-Z]*[1-9][A-Z]*$)
将只接受包含 1-9 范围内的数字的字符串,这些数字可以用字母 AZ 包围
不确定这是否是您要检查字符串的方式,请告诉我
static boolean testStrings(String a, String b) {
if (isValid(a) && isValid(b)) {
for (int i = 0; i < 4; i++) {
a = a.replaceFirst(String.valueOf(b.charAt(i)), "");
}
return a.length() <= (4 - 3);
}else
return false;
}
static boolean isValid(String s) {
return s.matches("^(?=[A-Z]*[1-9][A-Z]*$).{4}$");
}
于 2013-02-15T16:31:04.243 回答
2
如果您想知道两个长度为 4 的字符串是否共有三个字符,并且您知道所有字符都在受限范围内,那么您只需将位集相交并计算位:
public static boolean haveNCharsInCommon(String a, String b, int n) {
BitSet charsInA = charsIn(a);
BitSet charsInB = charsIn(b);
charsInA.and(charsInB);
return charsInA.cardinality() >= n;
}
private BitSet charsIn(String s) {
BitSet bs = new BitSet();
for (int i = 0, n = s.length(); i < n; ++i) {
bs.set(s.charAt(i);
}
return bs;
}
如果字符串可以包含任意代码点,您可能希望使用稀疏向量而不是位集。
于 2013-02-15T16:36:24.650 回答