Java 用于将SGML转换为XML的正则表达式

Java 用于将SGML转换为XML的正则表达式,java,regex,xml,sgml,Java,Regex,Xml,Sgml,我通过链接将sgml内容转换为xml内容。 使用sgmlString.replaceAll(“)([^]+?)(?=我有一个perl解决方案。 它基于对的特殊处理,将其合并 Perl代码: use strict; use warnings; my $Input =''; while(<>) { $Input.=$_; } $Input =~ s/<((?!SEC-HEADER)([^\/<>]+?)>)([^<>]+?)(\s*?)(?

我通过链接将sgml内容转换为xml内容。 使用
sgmlString.replaceAll(“)([^]+?)(?=我有一个perl解决方案。
它基于对
的特殊处理,将其合并

Perl代码:

use strict;
use warnings;

my $Input ='';
while(<>)
{
    $Input.=$_;
}

$Input =~ s/<((?!SEC-HEADER)([^\/<>]+?)>)([^<>]+?)(\s*?)(?=<[^\/])/<$1$3<\/$2>$4/g;
print $Input;
您的工具的猜测版本
(再一次,为一些小错误感到抱歉,请自己擦亮它们):

sgmlString.replaceAll(“\s*([^]+[^\s])\s*”,“$2”);
输出(在第一个代码后应用):

0001104659-17-052330.hdr.sgml:20170817
20170817060417
0001104659-17-052330
8-K
4.
20170816
7.01
8.16
20170817
20170817
再见,再见!

虽然它可能适用于手头的SGML,但通常使用regexp match/replace将SGML转换为XML是一种糟糕的方法,因为SGML具有标记省略/标记推断、属性名称和值省略(如HTML)以及SGML的XML配置文件中没有的其他简短形式和功能


但是我可以完全推荐专用的
osx
SGML到XML转换程序。它的源代码可以从中获得。如果你在Debian/Ubuntu上,你可以通过
sudo-apt-get-install-opensp
安装它,如果你在Mac OS上(使用你必须首先安装的MacPorts),通过
sudo-port-install-opensp
(但不知道MacBrew的等效版本).

我可以建议您考虑使用XSLT吗?据我所知,XSLT可能非常适合这个XML转换问题?我认为在这里使用正则表达式会带来一些问题,尤其是嵌套标记。我不知道XSLT以及如何使用它。您能提供一些指南/工作示例的链接或一些参考信息吗或者它。感谢您的快速响应。@TimBiegeleisen不会因为任何尚未形成良好格式的东西而导致XSLT失败吗?我对sgml没有经验,但这
(?!\\1)
不应该是
(?!\\\1)
,以便获得a)一个转义的``b)参考first match?@Yunnosch我对sgml和regex也没有经验,我尝试了你的建议。它解决了与项目标记相关的问题,但输出中仍然有两个文件管理器关闭。
  <SEC-HEADER>0001104659-17-052330.hdr.sgml : 20170817
     <ACCEPTANCE-DATETIME>20170817060417</ACCEPTANCE-DATETIME>
     <ACCESSION-NUMBER>0001104659-17-052330</ACCESSION-NUMBER>
     <TYPE>8-K</TYPE>
     <PUBLIC-DOCUMENT-COUNT>4</PUBLIC-DOCUMENT-COUNT>
     <PERIOD>20170816</PERIOD>
     <ITEMS>7.01<ITEMS>8.16</ITEMS>
     <FILING-DATE>20170817</FILING-DATE>
     <DATE-OF-FILING-DATE-CHANGE>20170817</DATE-OF-FILING-DATE-CHANGE>
     <FILER>bye bye see you!</FILER></FILER>
</SEC-HEADER>
  <SEC-HEADER>0001104659-17-052330.hdr.sgml : 20170817
         <ACCEPTANCE-DATETIME>20170817060417</ACCEPTANCE-DATETIME>
         <ACCESSION-NUMBER>0001104659-17-052330</ACCESSION-NUMBER>
         <TYPE>8-K</TYPE>
         <PUBLIC-DOCUMENT-COUNT>4</PUBLIC-DOCUMENT-COUNT>
         <PERIOD>20170816</PERIOD>
         <ITEMS>7.01</ITEMS>
         <ITEMS>8.16</ITEMS>
         <FILING-DATE>20170817</FILING-DATE>
         <DATE-OF-FILING-DATE-CHANGE>20170817</DATE-OF-FILING-DATE-CHANGE>
         <FILER>bye bye see you!</FILER>
    </SEC-HEADER>
use strict;
use warnings;

my $Input ='';
while(<>)
{
    $Input.=$_;
}

$Input =~ s/<((?!SEC-HEADER)([^\/<>]+?)>)([^<>]+?)(\s*?)(?=<[^\/])/<$1$3<\/$2>$4/g;
print $Input;
sgmlString.replaceAll("<((?!SEC-HEADER)([^\/<>]+?)>)([^<>]+?)(\s*?)(?=<[^\/])", "<$1$3<\/$2>$4");
<SEC-HEADER>0001104659-17-052330.hdr.sgml : 20170817
    <ACCEPTANCE-DATETIME>20170817060417</ACCEPTANCE-DATETIME>
    <ACCESSION-NUMBER>0001104659-17-052330</ACCESSION-NUMBER>
    <TYPE>8-K</TYPE>
    <PUBLIC-DOCUMENT-COUNT>4</PUBLIC-DOCUMENT-COUNT>
    <PERIOD>20170816</PERIOD>
    <ITEMS>7.01</ITEMS>
    <ITEMS>8.16</ITEMS>
    <FILING-DATE>20170817</FILING-DATE>
    <DATE-OF-FILING-DATE-CHANGE>20170817</DATE-OF-FILING-DATE-CHANGE>
    <FILER>
        bye bye see you!
    </FILER>
</SEC-HEADER>
$Input =~ s/<(?!\/)([^<>]+)>\s*([^<>]+[^\s<>])\s*<\/\1>/<$1>$2<\/$1>/g;
sgmlString.replaceAll("<(?!\/)([^<>]+)>\s*([^<>]+[^\s<>])\s*<\/\1>", "<$1>$2<\/$1>");
<SEC-HEADER>0001104659-17-052330.hdr.sgml : 20170817
    <ACCEPTANCE-DATETIME>20170817060417</ACCEPTANCE-DATETIME>
    <ACCESSION-NUMBER>0001104659-17-052330</ACCESSION-NUMBER>
    <TYPE>8-K</TYPE>
    <PUBLIC-DOCUMENT-COUNT>4</PUBLIC-DOCUMENT-COUNT>
    <PERIOD>20170816</PERIOD>
    <ITEMS>7.01</ITEMS>
    <ITEMS>8.16</ITEMS>
    <FILING-DATE>20170817</FILING-DATE>
    <DATE-OF-FILING-DATE-CHANGE>20170817</DATE-OF-FILING-DATE-CHANGE>
    <FILER>bye bye see you!</FILER>
</SEC-HEADER>