我正在做java项目,它比较两个句子并执行以下操作:
第一句话是:h = A(?X,?X3,?X32)
第二句话是:b = B(?X), C(?Y,?X32), W(?X3256)
我希望程序比较这两个句子,如果 h 中存在任何参数,但在 b 中不存在,请将 ? 到 ! 仅适用于此参数,并且仅在 h 句子中,因此上面的 h 句子应变为: 第一句话变成:h = A(?X,!X3,?X32)
我尝试使用它:
if(h.contains("?X3") && !(b.contains("?X3"))) {
h=h.replaceAll("\?X3","!X3");
}
但这将取代两者?X3 和 ?X32.它产生以下结果:h = A(?X,!X3,!X32)
,这是错误的,因为 X32 存在于 b 中。
另外,我想做一个通用方法,替换在 h 中但不在 b 中出现的任何参数,因为参数可以是任何值(字母或数字(。
知道怎么做吗?
由于您需要检测以"?"
开头的句子中的一些字母数字"参数",您可能需要实现一些帮助程序方法来将句子拆分为这些特定参数,然后检查第二个句子中是否不包含某些参数。
例如:
// helper split
private static List<String> split(String s) {
List<String> result = new ArrayList<>();
int start = 0;
for(int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '?') {
result.add(s.substring(start, i));
start = i++;
while (i < s.length()) {
c = s.charAt(i);
if (!Character.isLetterOrDigit(c)) {
result.add(s.substring(start, i));
start = i;
break;
} else {
i++;
}
}
}
}
result.add(s.substring(start, s.length()));
// result.forEach(System.out::println); // debug print
return result;
}
然后可以按如下方式进行测试:
String h = "A(?X,?X3,?X32)";
String b = "B(?X), C(?Y,?X32), W(?X3256)";
List<String> argsH = split(h);
List<String> argsB = split(b);
for (int i = 0; i < argsH.size(); i++) {
String arg = argsH.get(i);
if (arg.startsWith("?") && !argsB.contains(arg)) {
argsH.set(i, "!" + arg.substring(1));
}
}
h = String.join("", argsH);
System.out.println("Updated: " + h);
// output
Updated: A(?X,!X3,?X32)