文本存储在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而不是替换来进行替换。
提前致谢。
答案 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);
}
}
答案 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中的键。