在java中替换字符串中的单词

时间:2017-10-11 13:39:34

标签: java regex string

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"。

任何帮助表示感谢。

4 个答案:

答案 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)组成:

_

请参阅Java demo online

正则表达式看起来像

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内容相同。