2011-01-22 93 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>