String[] operatorList = { "name", "first_name", "last_name", "city" };
String originalString = "city=Houston^ORlast_name=Cervantsz^ORfirst_name=John^name=don";
for (String opElement : operatorList) {
if (originalString.contains(opElement)) {
String tempStr = originalString.replace(opElement, "user." + opElement);
originalString = tempStr;
}
}
System.out.println("originalString " + originalString);
输出:
user.city =休斯敦^ ORlast_user.name = Cervantsz ^ ORfirst_user.name =约翰^ user.name =不要
当我尝试用" user.name"替换名称时当时名字来自" last_name"替换为" last_user.name"和first_name with first_user.name
但我想替换" name"用" user.name"和" last_name"使用" user.last_name" 和" first_name"使用" user.first_name"。
任何帮助表示感谢。
答案 0 :(得分:1)
您可以添加前缀所有键并控制该键。实施例
String[] operatorList = {"name", "first_name", "last_name", "city"};
String originalString = "city=Houston^ORlast_name=Cervantsz^ORfirst_name=John^ORname=don";
for (String opElement : operatorList) {
if (originalString.contains("^OR"+opElement)) {
String tempStr = originalString.replace(opElement, "user." + opElement);
originalString = tempStr;
}
}
System.out.println("originalString " + originalString);
答案 1 :(得分:0)
如果您尝试更改的值始终是唯一且已生成(意味着它们的顺序始终相同),您只需将操作符设置为相同的顺序,然后使用replaceLast()
。
更完整的解决方案是确定字符串的构造方式。所有值都在它们前面有^
吗? OR
是为相同的值生成的,还是表示可选值?所以最后,什么允许你正确分割字符串。然后你可以使用正则表达式来使用周围的字符。
我会格式化字符串以确保分割符是恒定的(所有" ^ OR"变为" @@%!!"以及所有剩余的" ^&# 34;成为"%!!")所以所有被替换的字符串都以!!开头。然后我会使用剩余的" @@%"将字符串重新格式化为原始格式。或"%" :
String[] operatorList = { "name", "first_name", "last_name", "city" };
String originalString = "city=Houston^ORlast_name=Cervantsz^ORfirst_name=John^name=don";
originalString = originalString.replaceAll("\\^OR", "@@%!!");
originalString = originalString.replaceAll("\\^", "%!!");
//the order is important here
for (String opElement : operatorList) {
if (originalString.startsWith(opElement)) {
originalString = originalString.replaceFirst(opElement, "user." + opElement);
}
originalString = originalString.replaceAll("!!" + opElement, "user." + opElement);
// no need for an other alternative here because replaceAll returns the
// String as is if it does not find the first parameter in the String.
}
originalString = originalString.replaceAll("@@%", "^OR");
originalString = originalString.replaceAll("%", "^");
// the order here is also important
输出:"user.city=Houston^ORuser.last_name=Cervantsz^ORuser.first_name=John^user.name=don"
答案 2 :(得分:0)
如果所有密钥对都需要前缀“user。”,我想首先拆分 originalString 。
在Java8中
String originalString = "city=Houston^ORlast_name=Cervantsz^ORfirst_name=John^name=don";
String[] params = originalString.split("\\^");
String result = String.join("^", Arrays.stream(params)
.map(param -> param.startsWith("OR") ? "ORuser." + param.substring(2) : "user." + param)
.collect(Collectors.toList()));
System.out.println(result);
它也可以更改为for循环类型。
答案 3 :(得分:0)
您可以使用快速搜索并替换为仅在搜索词前面带有词边界或move.index
move.create
move.store
move.edit
move.update
move.destroy
+ ^
/ OR
/时动态创建的基于交替的模式等等运算符,后跟一个单词边界。请注意,此解决方案假设搜索词仅由单词字符(字母,数字或AND
)组成:
_
正则表达式看起来像
String[] operatorList = { "name", "first_name", "last_name", "city" };
// assuming operators only consist of word chars
String pat = "(\\b|\\^(?:OR|AND)?)(" + String.join("|", operatorList) + ")\\b";
String originalString = "city=Houston^ORlast_name=Cervantsz^ORfirst_name=John^name=don";
originalString = originalString.replaceAll(pat, "$1user.$2");
System.out.println(originalString);
// => user.city=Houston^ORuser.last_name=Cervantsz^ORuser.first_name=John^user.name=don
请参阅regex demo。
<强>详情
(\b|\^(?:OR|AND)?)(name|first_name|last_name|city)\b
- 第1组:单词边界(\b|\^(?:OR|AND)?)
或\b
符号和可选子字符串,^
或OR
(您可以在此处添加更多内容)在AND
)之后|
- 第2组:任何搜索词(name|first_name|last_name|city)
- 一个尾随字边界。替换模式中的\b
插入组1的内容,$1
与组2内容相同。