java - 仅用双引号之外的字典替换字符
问题描述
我的代码:
String text="üçgen: \"üçgenin üç köşesi vardır\"";
//Translate: triangle: "a triangle has three corners"
String[] trChars = {"ç", "ğ", "ö", "ş", "ı", "ü", "Ç", "Ğ", "Ö", "Ş", "İ", "Ü"};
String[] enChars = {"c", "g", "o", "s", "i", "u", "C", "G", "O", "S", "I", "U"};
for (int i = 0; i < trChars.length; i++) {
String regex = "(?<!\")"+ trChars[i] + "(?![\\w\\s]*[\"])";
text = text.replaceAll(regex, enChars[i]);
}
System.out.println(text);
结果:
ucgen: "ücgenin uc kosesi vardır"
我想要的结果:
ucgen: "üçgenin üç köşesi vardır"
引号中的某些字符已更改,而有些则没有更改,而它们都应保持不变。
解决方案
您可以通过创建带有要搜索的键和要替换的值的单个字典来修复代码,并且仅在找到不在双引号内的匹配项时才替换匹配项:
String text="üçgen: \"üçgenin üç köşesi vardır\"";
//Translate: triangle: "a triangle has three corners"
String[] trChars = {"ç", "ğ", "ö", "ş", "ı", "ü", "Ç", "Ğ", "Ö", "Ş", "İ", "Ü"};
String[] enChars = {"c", "g", "o", "s", "i", "u", "C", "G", "O", "S", "I", "U"};
Map<String, String> dictionary = new HashMap<String, String>();
for (int i = 0; i < trChars.length; i++) {
dictionary.put(trChars[i], enChars[i]);
}
StringBuffer result = new StringBuffer();
Matcher m = Pattern.compile("\"[^\"]*\"|([" + String.join("", trChars) + "])").matcher(text);
while (m.find()) {
if (m.group(1) != null) {
m.appendReplacement(result, dictionary.get(m.group(1)));
} else {
m.appendReplacement(result, m.group());
}
}
m.appendTail(result);
System.out.println(result.toString());
// => ucgen: "üçgenin üç köşesi vardır"
在线查看Java 代码。
正则表达式看起来像 "[^"]*"|([çğöşıüÇĞÖŞİÜ])
,一旦找到匹配并且第 1 组不为空,dictionary.get(m.group(1))
将获取找到的土耳其字母的相应 ASCII 值。否则,双引号之间的字符串将按原样返回。
推荐阅读
- android - 将 android app bundle 上传到 playstore 时出错。您的 app bundle 以无法识别的语言 jp 为目标
- firebase - 在 instagram、snapchat、facebook 等 Flutter 应用中实现添加好友功能
- python-3.x - 转换时间戳的时区的好方法是什么?
- linux - 在附加到文件之前删除所有尾随换行符
- assembly - 使用前关于堆栈的假设
- c++ - 在 OpenMP 并行 for 循环中调用 Armadillo 函数会导致数据损坏
- python - 如何在 Django 电子商务项目中将 Paypal 添加到付款
- python - 熊猫,无法连接数据帧
- tomcat - 无法从 Tomcat 中运行的应用程序连接到 Cassandra,但使用 Datagrip 连接成功
- visual-studio - 多久删除一次 bin 和 obj 文件?