簡體   English   中英

使用Perl Regex進行剝離/替換

[英]Stripping/Substitution with Perl Regex

因此,對於一般的編程人員來說,我還是一個新手,所以這可能是一個愚蠢的問題,但是我專門嘗試使用正則表達式剝離CSS標記。 基本上我有這個:

.style1 {  
    font-size: 24px;  
    font-weight: bold;  
    color: #FFEFA1;  
} 

我希望它看起來像這樣:

.style1:color:#FFEFA1

我想保留樣式名稱,顏色屬性和顏色十六進制,中間用冒號且沒有空格。 我正在嘗試以下操作來實現這一點:

$strip =~ s/\w+\}|\w+^#([0-9a-fA-F]{3})|([0-9a-fA-F]{6})//;

但它不起作用。 有人介意讓我走上正確的道路嗎?

干杯。

像大多數perl答案一樣,這從“ Use CPAN”開始。 您曾經想做的所有事情都已經完成。

use CSS;

my $css = CSS->new();

$css->read_string('
.style1 {
font-size: 24px;
font-weight: bold;
color: #FFEFA1;
} 
');

$color = $css->get_style_by_selector('.style1')
             ->get_property_by_name('color')
             ->values;

使用來自CPAN的CSS之類的模塊意味着某人已經考慮了您的正則表達式解決方案所沒有的邊緣情況。 考慮:

.someClass, div.otherClass, #someid {
    color: #aa00aa
}

使用正則表達式為特定選擇器獲取顏色變得更加困難。

如果您知道$strip會有一個color屬性,則可以使用

$strip =~ s!\s*{.*color:\s*(#[0-9a-f]{6});.*}!:color:$1!is;

注意事項:

  • i修飾符不區分大小寫
  • s修飾符表示“。” 字符匹配任何字符, 包括換行符

我是在plan9port環境shell中編寫的,但它可以輕松移植到任何linux。

這一段代碼創建了一個sed腳本來啟動數據。

#!/usr/local/plan9/bin/rc
# .style1:color:#FFEFA1
cat > this.sed <<EOF
# for lines which start with .
/\./{
# strip open curly brace
s, {,:,
# store element tag
h
# skip to next line
n
}

# strip close curly brace
/}/d

# for other lines
{
# remove spaces
s, ,,g
# get rid of ; at end
s,;$,,g
# pull back in the element tag
G
# join to one line
s,\n,,
# shift element tag to the start
# sed in plan 9 is a little different
# for gnu sed, use \( \) and \+
s,(.*)(\.[^.]+$),\2\1,
# finally print something
p
}
EOF

這部分代碼針對sed腳本運行您的輸入,

cat | sed -n -f this.sed <<EOF
.style1 {
font-size: 24px;
font-weight: bold;
color: #FFEFA1;
}
EOF

生成此輸出。

.style1:font-size:24px
.style1:font-weight:bold
.style1:color:#FFEFA1

您可以grep查找所需的行,也可以“ grep -v”查找不需要的行。

不知道為什么沒有提到它,但是大括號在正則表達式中有特殊含義,因此需要轉義。

暫無
暫無

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

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