0

我有数千个从 Java 属性文件生成的 xml 文件,这些文件准备以 TTX 格式进行翻译。它们包含相当多的变量,我需要保护它们免受翻译者的影响,因为它们经常破坏这些东西。变量的形式是数字或一对大括号之间的偶尔文本,例如。{0},{这个}。

如果这些变量还不是属性并且它们还不是ut元素的内部文本的一部分,我需要用 xml 元素包围这些变量,如下所示:

<ut DisplayText="{0}">&lt;{0}&gt;</ut>

我的输入如下所示:

<ut Type="start"DisplayText="string">&lt;string&gt;</ut> text string {0} 
<ut DisplayText="{1}">&lt;{1}&gt;</ut> in:
<ut DisplayText="\n">&lt;\n/&gt;</ut> {2}.
<ut Type="end" DisplayText="resource">&lt;/resource&gt;</ut>

正确的输出应该是这样的:

<ut Type="start"DisplayText="string">&lt;string&gt;</ut> text string <ut DisplayText="{0}">{0}</ut> 
<ut DisplayText="{1}">&lt;{1}&gt;</ut> in:
<ut DisplayText="\n">&lt;\n/&gt;</ut> <ut DisplayText="{2}">{2}</ut>.
<ut Type="end" DisplayText="resource">&lt;/resource&gt;</ut>

我最初的方法是使用正则表达式来匹配大括号中的术语,并使用模式替换围绕它构建 xml 元素。当上述第一个代码块中存在模式时,这种方法会失败。

以前的查找和替换模式(在记事本++中):

寻找

({[A-Za-z0-9]*})

代替

<ut DisplayText="\1">\1</ut>

开始看起来正则表达式不是适合这项工作的工具,所以我想要一些关于更好的方法、不同的工具,甚至只是一个更完整的正则表达式的建议,这可以让我快速且可重复地解决这个问题。

更新:这个问题比之前预想的要复杂一些。似乎还有更多需要保护的东西,涉及一些相当晦涩的语法,将变量与文本混合在某种条件语句中。从记忆里:

{o,choice|1#1  error|1&lt;{0,number,integer} errors}

其中“错误”和“错误”是可翻译的,不应受到保护。我们目前最简单的解决方案是运行上面的正则表达式,修复它创建的少数几个错误,然后为更复杂的项目运行几个更正常的查找和替换通道。它可以抽象为正则表达式,但现在这样做没有多大意义。

除了提供的改进的表达式之外,我很欣赏指向 xslt 和其他具有更好正则表达式支持的编辑器的指针。如果时间允许,我会尝试一些选项。

4

3 回答 3

1

如果我的假设是错误的,请告诉我,但从您的示例看来,您似乎想要更改 {} 而不是 <ut> 元素中的文本。对我来说,这似乎是对 XSLT 的一种简单使用。只需按原样输出 UT 元素并处理其间的任何文本。

于 2009-07-21T16:08:21.080 回答
0

为什么不尝试使用表达式

(?<=.){[A-Za-z0-9]+}(?=.$)

这将找到带有 1 个或多个字母或数字的 { 和 } 当此模式跟随标记和任意数量的空格 AND 后跟任意数量的空格和换行符时。

于 2009-07-22T16:45:29.163 回答
0

我最终在问题中使用了正则表达式的组合,并手动修复了导致的奇怪错误。这并不理想,但比试图找到完美的解决方案要快。

于 2012-05-23T06:27:57.513 回答