我认为您应该重新考虑设计并为几个“别名”使用单独的密钥-
甚至可能更好:根本没有别名,每次替换只有一个密钥。问题在于这些属性文件中的键不应包含空格(无论是否带括号),因此无法正确解析文件。如果您打印按键,您将看到它们在第一个空格处被截断,例如
(inv_start_date|invoicestart date)变为
(inv_start_date|invoice。
当然,这也意味着,即使将这些“别名”分割为单独的键,也不能拥有像这样的键
invoice start date,因为它仍然包含空格并且将无法正确解析。
您 可以 将这些替换项放入
MapJava源代码中的regualr 中:
static Map<String, String> replacements = new HashMap<>();static { replacements.put("inv_date", "INVOICE DATE"); replacements.put("(baseRate|Rate|tk_rate)", "LINE ITEM UNIT COST"); // ... more stuff ...}或手动解析文件,在处分割字符串
=并将其放入
Map。
并且由于像这样
(baseRate|Rate|tk_rate)的键实际上是有效的正则表达式,因此您可以使用
replaceAll它们替换所有的变体。如果它们不包含在字符串中,
replaceAll将什么都不做,因此
contains检查并不是真正必要的。
public static String toUserFriendlyErrorMessage(String message) { for (String key : replacements.keySet()) { message = message.replaceAll(key, replacements.get(key)); } return message;}输出示例:
Line 3 : Could not parse INVOICE DATE valueLine : 1 LINE ITEM UNIT COST is a required field
或者,如果您想使用“ Java 8魔术”,则可以使用
reduce,但就我个人而言,我认为循环更易读。
return replacements.keySet().stream() .reduce(message, (s, k) -> s.replaceAll(k, replacements.get(k))) .toString();



