我的代码:
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值。否则,双引号之间的字符串将原样返回。
字符串索引快速高效。我想这就是你想要做的:
public class Turk {
public static void main(String[] args) {
try {
String text = "üçgen: "üçgenin üç köşesi vardır"";
// Translate: triangle: "a triangle has three corners"
System.out.println(text);
String trChars = "çğöşıüÇĞÖŞİÜ";
String enChars = "cgosiuCGOSIU";
StringBuilder transliteration = new StringBuilder(text.length());
boolean transliterate = true;
int ix = -1;
for (int i = 0; i < text.length(); i++) {
char c = text.charAt(i);
if (c == '"') {
transliterate = !transliterate;
}
if ((ix = trChars.indexOf(c)) >= 0 && transliterate) {
transliteration.append(enChars.charAt(ix));
} else {
transliteration.append(c);
}
}
System.out.println(transliteration.toString());
} catch (Throwable t) {
t.printStackTrace();
}
}
}
试试这个
public static void main(String[] args) {
String text = "üçgen: "üçgenin üç köşesi vardır"";
String[] trChars = {"ç", "ğ", "ö", "ş", "ı", "ü", "Ç", "Ğ", "Ö", "Ş", "İ", "Ü"};
String[] enChars = {"c", "g", "o", "s", "i", "u", "C", "G", "O", "S", "I", "U"};
Map<String, String> map = IntStream.range(0, trChars.length)
.boxed().collect(Collectors.toMap(i -> trChars[i], i -> enChars[i]));
Pattern pat = Pattern.compile(""[^"]*"|(.)");
String trancelated = pat.matcher(text)
.replaceAll(m -> m.group(1) != null
? map.getOrDefault(m.group(), m.group()) : m.group());
System.out.println(trancelated);
}
输出:
ucgen: "üçgenin üç köşesi vardır"