用字典替换双引号以外的字符

  • 本文关键字:字符 字典 替换 java regex
  • 更新时间 :
  • 英文 :


我的代码:

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"

最新更新