[英]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;
}
正則表達式應匹配第二個和第五個塊並捕獲
所以最終的預期結果是:
.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.