3 回答

TA貢獻(xiàn)1810條經(jīng)驗 獲得超5個贊
你可以試試
#(?:[0-9A-Fa-f]{6}|[0-9A-Fa-f]{3})(?=;|[^(]*\))
所以這里的想法是6
如果沒有找到匹配字符匹配,則以更高的優(yōu)先級匹配字符長度3
,以確保它不匹配#BED
或者我們需要匹配十六進(jìn)制顏色代碼的終止,所以我們使用帶有交替的前瞻

TA貢獻(xiàn)1860條經(jīng)驗 獲得超8個贊
您可以使用
r = re.compile(r'#[0-9A-Fa-f]{3}(?:[0-9A-Fa-f]{3})?(?!$)', re.M)
見證明
示例 Python 代碼:
import re
regex = r"#[0-9A-Fa-f]{3}(?:[0-9A-Fa-f]{3})?(?!$)"
test_str = ("#BED\n"
"{\n"
" color: #FfFdF8; background-color:#aef;\n"
" font-size: 123px;\n"
" background: -webkit-linear-gradient(top, #f9f9f9, #fff);\n"
"}\n"
"#Cab\n"
"{\n"
" background-color: #ABC;\n"
" border: 2px dashed #fff;\n"
"}")
matches = re.findall(regex, test_str, re.MULTILINE)
print(matches)

TA貢獻(xiàn)1900條經(jīng)驗 獲得超5個贊
一方面,您可以先匹配 6 位代碼,否則匹配 3 位代碼將首先匹配其中一半(因此不匹配完整的 6 位代碼)。但是,由于您還只想匹配 CSS 屬性規(guī)則,而不是選擇器,請?zhí)崆安檎?code>;、,
或)
:
(?i)#(?:[0-9a-f]{6}|[0-9a-f]{3})(?=[;,)])
https://regex101.com/r/BtZaoV/2
如果您還需要能夠排除組合選擇器,例如#BED, foo {
,您可以先查看非{
s 后跟}
:
(?i)#(?:[0-9a-f]{6}|[0-9a-f]{3})(?=[^{]*})
https://regex101.com/r/BtZaoV/3
使用不區(qū)分大小寫的標(biāo)志來保持 DRY。(您也可以{3}){1,2}
用來避免重復(fù)字符集,但這會使模式更難閱讀 IMO)
添加回答
舉報