Regex 查找本地书签的用法,并用书签的内容替换本地书签

Regex 查找本地书签的用法,并用书签的内容替换本地书签,regex,perl,awk,sed,regex-lookarounds,Regex,Perl,Awk,Sed,Regex Lookarounds,我不熟悉正则表达式,还在学习 我有一个XML文件,它有一个文本节点,后跟临床信息 在文本节点中,我定义了如下内容ID <item> <content ID="a138134600007">Wellbutrin TABS;</content> <content ID="a138134600007-sta"> (Active) </content> <content ID

我不熟悉正则表达式,还在学习

我有一个XML文件,它有一个文本节点,后跟临床信息

在文本节点中,我定义了如下内容ID

<item>
    <content ID="a138134600007">Wellbutrin TABS;</content>
    <content ID="a138134600007-sta"> (Active) </content>
    <content ID="a138134600007-comments"> </content>
</item>

维布曲林片;
(现行)
稍后,在包含实际临床数据的较低xml片段中,将引用这些ID

              <text>
                <reference value="#al38134600007" />
              </text>

我想用id表示的内容替换上面的文本节点,以便将文件转换为

              <text>
                Wellbutrin TABS;
              </text>

维布曲林片;
作为一名Java开发人员,我拒绝编写一个非常难看的解决方案,并寻找一个更优雅的正则表达式解决方案(更不用说性能了,因为转换需要在50万个xml CCD中进行)

我想用perl来做这件事,因为它在linux上默认是可用的,但是我很乐意使用任何可以解决这个问题的技术

有什么建议吗

提前感谢,, 干杯 Vipin.

我建议看看。正如许多人所说,不要使用正则表达式来解析XML文件

您还可以使用xmlint(与xpath一起使用)。我还建议在这里发布示例XML文件,而不是GIF img,我建议查看。正如许多人所说,不要使用正则表达式来解析XML文件


您还可以使用xmlint(与xpath一起使用)。我还建议在这里发布示例XML文件,而不是GIF img,因为发问者需要它:根据一些假设,一个简单的正则表达式就可以做到

假设文件没有XML语法错误,
标记只在
标记中找到,空白的使用和属性的顺序在整个XML中是一致的,即它是自动生成的,
标记和子项正好覆盖三行,xml看起来与问题中的示例相同:

项目/内容节点

          <item>
            <content ID="a1234"> text </content>
            <!-- more -->
          </item>
否则,只需使用XML解析器。它有很多CPAN模块。我喜欢
XML::Parser
。它不需要将整个文件加载到内存中

另外,有一件事可能不适合假设,
标记只在
标记中找到。但这只是一个简单的改变。如果OP提供详细信息,将进行更新


另外,正则表达式很简单;)。逻辑相当长。如果输入XML(包括没有特别提到的标记)不需要保留,那么它会更简单。

因为提问者要求它:根据一些假设,一个简单的正则表达式可以做到这一点

假设文件没有XML语法错误,
标记只在
标记中找到,空白的使用和属性的顺序在整个XML中是一致的,即它是自动生成的,
标记和子项正好覆盖三行,xml看起来与问题中的示例相同:

项目/内容节点

          <item>
            <content ID="a1234"> text </content>
            <!-- more -->
          </item>
否则,只需使用XML解析器。它有很多CPAN模块。我喜欢
XML::Parser
。它不需要将整个文件加载到内存中

另外,有一件事可能不适合假设,
标记只在
标记中找到。但这只是一个简单的改变。如果OP提供详细信息,将进行更新


另外,正则表达式很简单;)。逻辑相当长。如果不需要保留输入XML(包括未特别提及的标记),则会更简单。

使用XML::LibXML可以轻松实现同样的效果,而且比使用正则表达式更可靠,因为正则表达式几乎无法处理特殊字符、转义序列、新行和类似的内容:

my $doc = XML::LibXML->load_xml(IO => \*STDIN); # or stream or file..
foreach my $node ($doc->documentElement()->findnodes("/path/to/your/element/text/reference")) {
    $node->parentNode()->appendText(yourLookupMethod($node->getAttribute("value"));
    $node->unbindNode();
}
$doc->toFH(\*STDOUT, 0); # or stream or file...

使用XML::LibXML可以轻松实现这一点,而且比使用正则表达式更可靠,因为正则表达式很难处理特殊字符、转义序列、新行以及类似的内容:

my $doc = XML::LibXML->load_xml(IO => \*STDIN); # or stream or file..
foreach my $node ($doc->documentElement()->findnodes("/path/to/your/element/text/reference")) {
    $node->parentNode()->appendText(yourLookupMethod($node->getAttribute("value"));
    $node->unbindNode();
}
$doc->toFH(\*STDOUT, 0); # or stream or file...

解析XML时,优雅的解决方案通常是不使用正则表达式:-)使用文本解析XML不是一个好主意他们有XML解析器,因此我们无法针对GIF测试可能的解决方案。包括一个小的、完整的、可测试的示例输入和预期输出。请不要发布代码图像的链接;只需发布代码,尤其是因为代码太少了。您能相应地编辑您的问题吗?“作为一名Java开发人员,我拒绝编写一个非常难看的解决方案”我不同意在解析XML时这两者有任何关系,优雅的解决方案通常是不使用正则表达式:-)用文本解析xml不是一个好主意他们有xml解析器,因此我们无法针对GIF测试可能的解决方案。包括一个小的、完整的、可测试的示例输入和预期输出。请不要发布代码图像的链接;只需发布代码,尤其是因为代码太少了。您能相应地编辑您的问题吗?“作为一名Java开发人员,我拒绝编写一个非常难看的解决方案”我不同意这两者之间存在任何关系XML不符合xsd,因此不能使用jaxb,不确定Perl XML解析器是否需要xsd验证…最终使用了Java DOM,和其他人一样,最好不要使用正则表达式进行XML解析。XML不符合xsd,因此不能使用jaxb,不确定Perl XML解析器是否需要xsd验证…最终使用Java DOM,和其他人一样,您是对的,最好不要使用正则表达式进行XML解析。非常感谢我最终按照大家的建议使用Java DOM,但非常感谢您提供了答案,我肯定是将其用作学习工具。非常感谢我最终按照大家的建议使用Java DOM,但非常感谢您提供了答案,我肯定是把它作为一个学习工具来使用的。我同意,但因为我是一个优秀的Java程序员,我认为如果我使用DOM,也可以