2011-01-22 33 views
0

我试图修改一个XML文件,其中包含持有业务分支的开放时间的元素。 XML文件不一致,因为某些分支只有开放时间和结束时间,其他分支有开放时间,午餐结束时间,午餐开放时间和结束时间。以下两种类型的需要正则表达式帮助修改XML文件

例子:

<monday>10.00,17.00</monday> 
<monday>09.00,12.30,13.30,17.00</monday> 

我想这些字符串格式化为一个更好的格式,如下面的:

<monday> 
    <open>10.00</open> 
    <lunch></lunch> 
    <close>17.00</close> 
</monday> 

<monday> 
    <open>09.00</open> 
    <lunch>12.30 - 13.30</lunch> 
    <close>17.00</close> 
</monday> 

我一直在试图使用的BBEdit正则表达式在我的Mac上进行更改但我遇到了困难,具体而言,我认为是因为我不确定如何获取正则表达式来替换我称之为匹配的文本的子集。例如,在伪代码我想正则表达式来做到这一点:

更换<monday>time1,time2</monday>
<monday><open>time1</open><lunch></lunch><close>time2</close></monday>

更换<monday>time1,time2,time3,time4</monday>
<monday><open>time1</open><lunch>time2 - time3</lunch><close>time4</close></monday>

我不是太熟悉正则表达式,所以我“M做一些错误,我敢肯定,但到目前为止,我一直在尝试以下:

更换>#+\.#+,#+\.#+<><open>#+\.#+<open><lunch></lunch><close>#+.\#+<

我明白这是不会反正工作,因为我说的是正则表达式与字符串“#+”等与#+来代替它匹配的数字

如何能够做到什么我想通过正则表达式或其他手段来做,以及如何告诉正则表达式使用表达式进行比较,但只替换它匹配的字符的子集?

+1

或者... **只需使用一个XML库**(与XPath的/ XQuery的或许只是一个DOM支持 - 点是** XML是结构化的,应该[总是]这样对待** )。没有意义让生活变得如此复杂和容易出错。有些人可能也会推荐XSLT,但我一直赞成在大多数情况下只使用一个好的XML库。 XSLT(1.x)中太多的东西只是过于复杂,并且它涉及在已知的通用语言中托管/使用XML库时学习新的(有限的)DSL。 – 2011-01-22 22:57:21

+0

对不起,如果我不清楚,我试图改进这个XML文件的结构,所以我可以用可预测的结果来解析它。它们之间存在不一致,所以我只是试图使这个XML文件适合一致的结构。 – conorgriffin 2011-01-22 23:10:16

回答

0

嗯,我觉得它比我预期的要快。下面是我使用的表达式:

我用下面的查找字符:

(<[a-z]+day>)([0-9]+\.[0-9]+),([0-9]+\.[0-9]+)(</[a-z]+day>) 

...及以下替换字符串:

\1<open>\2</open><lunch></lunch><close>\3</close>\4 

匹配以下行:

<monday>10.00,17.00</monday> 

这导致以下输出:

<monday><open>10.00</open><lunch></lunch><close>17.00</close></monday>