我有数千个从 Java 属性文件生成的 xml 文件,这些文件准备以 TTX 格式进行翻译。它们包含相当多的变量,我需要保护它们免受翻译者的影响,因为它们经常破坏这些东西。变量的形式是数字或一对大括号之间的偶尔文本,例如。{0},{这个}。
如果这些变量还不是属性并且它们还不是ut元素的内部文本的一部分,我需要用 xml 元素包围这些变量,如下所示:
<ut DisplayText="{0}"><{0}></ut>
我的输入如下所示:
<ut Type="start"DisplayText="string"><string></ut> text string {0}
<ut DisplayText="{1}"><{1}></ut> in:
<ut DisplayText="\n"><\n/></ut> {2}.
<ut Type="end" DisplayText="resource"></resource></ut>
正确的输出应该是这样的:
<ut Type="start"DisplayText="string"><string></ut> text string <ut DisplayText="{0}">{0}</ut>
<ut DisplayText="{1}"><{1}></ut> in:
<ut DisplayText="\n"><\n/></ut> <ut DisplayText="{2}">{2}</ut>.
<ut Type="end" DisplayText="resource"></resource></ut>
我最初的方法是使用正则表达式来匹配大括号中的术语,并使用模式替换围绕它构建 xml 元素。当上述第一个代码块中存在模式时,这种方法会失败。
以前的查找和替换模式(在记事本++中):
寻找
({[A-Za-z0-9]*})
代替
<ut DisplayText="\1">\1</ut>
开始看起来正则表达式不是适合这项工作的工具,所以我想要一些关于更好的方法、不同的工具,甚至只是一个更完整的正则表达式的建议,这可以让我快速且可重复地解决这个问题。
更新:这个问题比之前预想的要复杂一些。似乎还有更多需要保护的东西,涉及一些相当晦涩的语法,将变量与文本混合在某种条件语句中。从记忆里:
{o,choice|1#1 error|1<{0,number,integer} errors}
其中“错误”和“错误”是可翻译的,不应受到保护。我们目前最简单的解决方案是运行上面的正则表达式,修复它创建的少数几个错误,然后为更复杂的项目运行几个更正常的查找和替换通道。它可以抽象为正则表达式,但现在这样做没有多大意义。
除了提供的改进的表达式之外,我很欣赏指向 xslt 和其他具有更好正则表达式支持的编辑器的指针。如果时间允许,我会尝试一些选项。