ENUM_NLS翻译逻辑优化问询:带编号字符串拆分重组实现
解决带编号枚举描述的翻译重组问题
你需要同时处理两种格式的枚举描述:普通字符串(比如house hello)和带编号的字符串(比如1 - Selected house),核心需求是拆分编号前缀、翻译核心文本后再重组。下面是具体的解决方案和修改后的代码:
核心思路
- 用正则表达式识别带编号的格式:匹配以
数字 + 空格 + - + 空格开头的字符串,捕获编号前缀和后面的待翻译文本 - 对普通文本直接匹配翻译;对带编号的文本,用拆分出的核心文本去匹配翻译,再和前缀拼接
- 封装工具方法处理字符串拆分,让代码逻辑更清晰、易维护
修改后的完整代码
import java.io.BufferedWriter; import java.io.FileWriter; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class EnumTranslationHandler { // 工具方法:拆分枚举描述,返回长度为2的数组 // 索引0:编号前缀(带编号格式返回"1 - "这类,普通格式返回空字符串) // 索引1:待翻译的核心文本 private static String[] splitEnumDescription(String enumDesc) { // 正则匹配:严格匹配开头的数字+空格+-+空格格式 Pattern pattern = Pattern.compile("^(\\d+ - )(.*)$"); Matcher matcher = pattern.matcher(enumDesc.trim()); if (matcher.matches()) { return new String[]{matcher.group(1), matcher.group(2).trim()}; } else { // 普通格式,前缀为空,核心文本为原字符串去除首尾空格 return new String[]{"", enumDesc.trim()}; } } public void getTraduttoreIt_ENUM_NLS() throws Exception { List<EnumNls> db2 = getListEnumNls(); List<DizioPt> sqlServer = getListDizioPt(); BufferedWriter scrivi = new BufferedWriter( new FileWriter("C:/Users/francesco/Desktop/Table_THERA.ENUM_NLS_Sez4.txt")); System.out.println("-------------------WRITE FILE N°4--------TRANSLATION------------------------"); for (int i = 0; i < db2.size(); i++) { EnumNls enumNls = db2.get(i); String enumDesc = enumNls.getEnumDesc(); // 拆分枚举描述为前缀和待匹配关键词 String[] splitResult = splitEnumDescription(enumDesc); String prefix = splitResult[0]; String keywordToMatch = splitResult[1]; for (int j = 0; j < sqlServer.size(); j++) { DizioPt dizioPt = sqlServer.get(j); // 用拆分后的核心文本匹配翻译库中的关键词 if (keywordToMatch.equals(dizioPt.getKeyword().trim())) { String translatedText = dizioPt.getTraduzione().trim(); // 重组最终文本:编号前缀 + 翻译后的内容 String finalDesc = prefix + translatedText; // 用String.format简化SQL拼接,提升可读性 String insertSql = String.format( "INSERT INTO THERA.ENUM_NLS VALUES('%s','%s','en','%s');", enumNls.getAttributeRef().trim(), enumNls.getEnumValue().trim(), finalDesc ); System.out.println(insertSql); scrivi.write(insertSql); scrivi.newLine(); scrivi.flush(); } } } scrivi.close(); } // 以下为假设的已有方法/实体类,你可根据实际情况替换 private List<EnumNls> getListEnumNls() { // 原数据获取逻辑 return null; } private List<DizioPt> getListDizioPt() { // 原翻译库获取逻辑 return null; } } class EnumNls { private String attributeRef; private String enumValue; private String enumDesc; public String getAttributeRef() { return attributeRef; } public String getEnumValue() { return enumValue; } public String getEnumDesc() { return enumDesc; } } class DizioPt { private String keyword; private String traduzione; public String getKeyword() { return keyword; } public String getTraduzione() { return traduzione; } }
关键细节说明
- 正则准确性:
^(\\d+ - )(.*)$确保只匹配以数字开头、后跟标准-前缀的格式,避免误匹配包含-但不是编号的文本 - 边界处理:所有字符串都做了
trim()处理,避免因首尾空格导致匹配失败或SQL语句出现无效空格 - 代码可读性:用
String.format()替代原始字符串拼接,减少冗余代码,也方便后续修改SQL模板
修改后的代码可以完美兼容两种场景:
- 普通字符串(如
house hello):直接匹配翻译后输出 - 带编号字符串(如
1 - Selected house):拆分出1 -前缀,用Selected house匹配翻译得到已选房屋,最终重组为1 - 已选房屋输出
内容的提问来源于stack exchange,提问作者francesco
相关产品推荐
相关产品推荐

