我正在尝试将短格式单词替换为java中的字符串,但不知道如何以良好的方式执行它,因为我可以有多个('ve're'nt)等等。使用数组列表是否合适?若是,我该如何实现呢?
到目前为止我尝试过:
public class main {
public static void main(String[] args) {
String s = "We've been doing this for ages. I'm having a difficulty doing this. Thats getting confusing.";
s = s.replaceAll("we've", "we have");
s = s.replaceAll("I'm", "I am");
s = s.replaceAll("that's", "that is");
}
}
谢谢!
答案 0 :(得分:1)
您可以使用正则表达式更有效地执行此操作。
首先,构建一个包含搜索和替换的地图。
Map<String, String> replacements =
Map.of("we've", "we have", "I'm", "I am" /* etc */);
(或一些Java 9之前的等价物)
现在,构建一个正则表达式以匹配您要替换的内容:
Pattern p = Pattern.compile(
replacements.keySet()
.stream()
.map(Pattern::quote)
.collect(Collectors.joining("|")));
现在,创建一个Matcher和一个StringBuilder来累积新字符串:
Matcher m = p.matcher(s);
StringBuffer sb = new StringBuffer();
while (m.find()) {
String replacement = replacements.get(m.group(0));
m.appendReplacement(sb, replacement);
}
m.appendTail(sb);
String newS = sb.toString();
答案 1 :(得分:0)
您可以使用Map<String, String>
,例如HashMap,其中键将是替换的缩写形式,替换字符串的值。然后你可以迭代Map.entrySet()
并在字符串上调用replace
方法。
代码可以(请注意我省略了首字母 - 除了我必须是大写的 - 以避免大写问题):
String str = s;
HashMap<String, String> replacements = new HashMap<>();
replacements.put("e've", "e have");
replacements.put("I'm", "I am");
replacements.put("hat's", "hat is");
for (Map.Entry<String, String> entry: replacements.entrySet()) {
str = str.replaceAll(entry.getKey(), entry.getValue());
}
如果它只打算使用一次,它确实没有意义,但它可能是可以在许多字符串上重复使用的方法的基础。
答案 2 :(得分:0)
如果您不想一直创建新字符串,则可以使用StringBuilder
:
StringBuilder builder = new StringBuilder("We've been doing this for ages. I'm having a difficulty doing this. That's getting confusing.");
HashMap<String, String> replacements = new HashMap<>();
replacements.put("'ve", " have");
replacements.put("'m", " am");
replacements.put("'s", " is");
// others...
for (Map.Entry<String, String> entry: replacements.entrySet()) {
int index;
while ((index = builder.indexOf(entry.getKey())) != -1) {
builder.replace(index, index + entry.getKey().length(), entry.getValue());
}
}
System.out.println(builder);
请注意,如果你试图替换这样的所有收缩,你不太可能100%成功,因为有些短语收缩到相同的收缩,例如:
那有 - &gt;那&#39; S 那是 - &gt;也就是说&#39; S
另请注意,有些'
表示收缩:
玛丽&lt; - 你怎么处理这个?
你可以通过寻找更具体的序列来解决第二个问题,例如That's
而不仅仅是's
,但对于第一个问题,你需要以某种方式理解上下文。