[英]Repeating pattern matching in Eclipse regexp
我試圖將XML文件轉換為Eclipse中的SQL語句,以節省轉換大文件的手動工作。
一行,例如:
<TABLE_NAME COL_1="value1" COL_2="value2"/>
應轉換為:
insert into TABLE_NAME (COL_1, COL_2) values ("value1", "value2");
到目前為止,我已經設法通過以下方式匹配並捕獲表名和第一列/值對:
<(\w+)( \w+)=(".+?").*/>
末尾的.*
僅用於測試模式的第一部分,完成后應將其刪除。
以下替換模式將產生以下結果:
insert into $1 ($2) values ($3);
insert into TABLE_NAME ( COL_1) values ("value1");
我遇到的問題是不同表的列數不同,所以我想要一個通用模式,該模式將匹配n個列/值對,並在替換模式中重復使用捕獲的組。 盡管\\G
似乎是一個很好的候選人,但我還沒有設法了解如何做到這一點。
理想情況下,這將在單個regexp語句中解決,盡管我也不會反對必須按順序運行的多個語句(盡管我真的不想強迫開發人員為每個列/執行一次值對)。
有人有想法么?
最后,我並沒有使用最初設想的正則表達式來解決這個問題。 考慮到其他解決方案,最后通過重構測試代碼使其可重用,然后選擇dbunit使用測試將數據寫入開發數據庫的不同階段來解決了該問題。
我知道這是對測試的濫用,但這確實使整個過程變得更加簡單,因為用戶會收到關於是否插入數據的綠色/紅色反饋,並且可以為手動驗收測試插入相同的測試數據。用於自動化組件/集成測試(將dbunit與內存數據庫一起使用)。 只要這些偽造的測試類沒有添加到測試套件中,它們就只能手動執行。
最終導致的偽造測試極其簡單和輕便,例如:
public class MyComponentTestDataInserter extends DataInserter {
@Override
protected String getDeleteSql() {
return "./input/component/delete.sql";
}
@Override
protected String getInsertXml() {
return "./input/component/TestData.xml";
}
@Test
public void insertIntoDevStage() {
insertData(Environment.DEV);
}
@Test
public void insertIntoTestStage() {
insertData(Environment.TEST);
}
}
這還具有另一個優勢,即開發人員可以通過在IDE中的上下文菜單中簡單地執行單個測試方法,將數據插入到單個環境中。 同時,通過運行整個測試類,可以將完全相同的數據同時部署到所有環境。
此外,在數據清理或插入期間的任何時候發生故障都會導致整個事務回滾,從而防止出現不一致的狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.