簡體   English   中英

使用正則表達式替換多行文本

[英]Using a Regex to Replace Text Across Multiple Lines

我在 gwt 項目中有一些 css 文件需要更新。 我需要找出一個正則表達式,我可以用它來定位和替換模板表達式('%sometext%'),同時還要在每個塊之前根據模板附加一些前綴文本。 例如,假設我有一塊 css,如下所示:

.x-tabs-wrap, .x-layout-panel .x-tabs-top .x-tabs-wrap {
    background: #deecfd;
    border: 1px solid #8db2e3;
    padding-bottom: 2px;
    padding-top: 0;
}

.x-tabs-strip-wrap{
    padding-top: 1px;
    background: url('%aerotabStripBggif%') #cedff5 repeat-x bottom;
    border-bottom: 1px solid #8db2e3;
}

.x-tabs-strip .x-tabs-text {
    color: #15428b;
    font: bold 11px tahoma,arial,verdana,sans-serif;
}

.x-tabs-strip .on .x-tabs-text {
    cursor: default;
    color: #15428b;
}

.x-tabs-top .x-tabs-strip .on .x-tabs-right {
    background: url('%aerotabSpritegif%') no-repeat right 0;
}

正則表達式應匹配第二個和第五個塊並捕獲

  1. 從點到右大括號的整個塊
  2. 打開模板文本url('%
  3. 模板字符串aerotabSpritegif
  4. 結束模板文本%')

所以最終的預期結果是:

.x-tabs-wrap, .x-layout-panel .x-tabs-top .x-tabs-wrap {
    background: #deecfd;
    border: 1px solid #8db2e3;
    padding-bottom: 2px;
    padding-top: 0;
}

@url aerotabStripBggif aerotabStripBggif;
.x-tabs-strip-wrap{
    padding-top: 1px;
    background: aerotabStripBggif #cedff5 repeat-x bottom;
    border-bottom: 1px solid #8db2e3;
}

.x-tabs-strip .x-tabs-text {
    color: #15428b;
    font: bold 11px tahoma,arial,verdana,sans-serif;
}

.x-tabs-strip .on .x-tabs-text {
    cursor: default;
    color: #15428b;
}

@url aerotabSpritegif aerotabSpritegif;
.x-tabs-top .x-tabs-strip .on .x-tabs-right {
    background: aerotabSpritegif no-repeat right 0;
}

我嘗試了多種不同的方法,到目前為止我找不到任何正確匹配的東西。 一切要么太窄,什么都不匹配,要么太寬,最終匹配多個塊。 到目前為止,我能想到的最好的是:

(?s)^\.[A-Za-z]+?.+?url\(\'\%.+?\%\'\).+?\} 

查看 regex101 上的工具,我可以看到在第一個文本塊中找不到 url 的匹配項,因此匹配器繼續運行,直到最終在第二個塊中找到匹配項。 我需要以某種方式定義開始點和結束括號是邊界,但我似乎無法弄清楚如何做到這一點。

我在這里做錯了什么? 我需要做什么才能讓這個正則表達式按預期運行?

請您嘗試搜索模式:

(?m)^(\.[^}]+?)url\('%(.+?)%'\)([^}]+})

和替換:

@url $2 $2;\n$1$2$3

演示

  • 多行模式(?m)使插入符號^匹配任何行的開頭。
  • 正如您所發現的?即使您放置了.+?url 禁用greedy match 這是因為點. 匹配任何東西,無論邊界如何。 然后我將其修改為[^}]+?url而不是 go 遠遠超出該塊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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