簡體   English   中英

在Eclipse正則表達式中重復模式匹配

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM