如果存在于hashmap中,则替换所有字符串,但首先在文本中

时间:2014-09-08 23:39:36

标签: java regex

文本存储在String变量中,并由一些API处理,以便为我提供存储键和值的hashmap。键是文本中的一些特定单词,值是一个新单词,它将替换文本中的键。我必须处理文本,以便用hashmap中的值替换键,但我必须保留文本中第一个键的实例。

问题: 我可以通过迭代hashmap并替换文本中的键来替换我正在做的所有实例。我想保留第一个匹配的密钥。

在字符串函数中,我看到的是replace,replaceAll,replaceFirst。

我该如何处理这个案子。

例如:

输入:示例[2]这是一个示例文本。这是一个示例文本[69-3]。这是一个样本[69-3]文本。

hashmap:{sample = sImple,text = text2,[69-3] = somenum}

输出:示例[2]这是一个示例文本。这是 sImple text2 [69-3]。这是一个 sImple text2 somenum

关键匹配也适用于整个单词,而不是subString。就像名称是关键字而姓氏是文本中的字符串那样它就不应该匹配了,而且名称是" name"不应该改变。我使用replaceAll而不是替换来进行替换。

提前致谢。

4 个答案:

答案 0 :(得分:0)

以下

String input="Example [2] This is a sample text. This is a sample xtexty text [69-3]. This is a sample [69-3] textME text.";

        Map<String,String> map = new HashMap<String,String>();
        map.put("sample","sImple");
        map.put("text","text2");
        map.put("[69-3]","somenum");

        for(Map.Entry<String, String> entry : map.entrySet()){
            input =input.replace(entry.getKey(),entry.getValue());
        input = input.replaceFirst(entry.getValue(), entry.getKey());
        Pattern p = Pattern.compile("(\\w+)*"+entry.getValue()+"(\\w+)|(\\w+)"+entry.getValue()+"(\\w+)*");
        Matcher matcher =  p.matcher(input);
       while( matcher.find()){
          int r =  matcher.group().indexOf(entry.getValue());
          int s =r+input.indexOf(matcher.group());
     input = input.substring(0,s)+entry.getKey()+input.substring(s+entry.getValue().length());
       }    
        }

        System.out.println(input);

    }

将打印:

  Example [2] This is a sample text. This is a sImple xtexty text2 [69-3]. This is a sImple somenum textME text2.

以上代码不会替换子字符串,可以按照您的意愿工作。

答案 1 :(得分:0)

您可以找到第一个外观的索引,并在此索引后替换所有索引。 因为我没有找到replaceAll获取偏移参数,我可以使用StringBuilder#replace建议您使用这个手工制作的解决方案:

public static void replaceAllButFirst(StringBuilder modifiedString, String match, String replacement) {
    int index = modifiedString.indexOf(match);
    int matchLength = match.length(), replacementLength = replacement.length();
    if (index == -1) return;
    index += matchLength;
    index = modifiedString.indexOf(match, index);
    while (index != -1) {
        modifiedString.replace(index, index + matchLength, replacement);
        index += replacementLength;
        index = modifiedString.indexOf(match, index);
    }
}

Example

答案 2 :(得分:0)

您可以使用正则表达式执行此操作。

这个帖子已经解决了你的问题的答案:

In Java how do you replace all instances of a character except the first one?

答案 3 :(得分:0)

我使用replaceFirst和replaceAll来解决这个问题。

创建一个字典2,其中包含与字典相同的Key,而dictionary2中的值将是key的修改版本

foreg:

字典:{sample = simple}

dictionary2:{sample = sample --- A - }

然后使用replaceFirst替换text2中字符串的第一个实例。

接下来替换文本中将保留第一个实例的字符串实例,然后将修改后的第一个实例替换为dictionary2中的键。