這個(gè)函數(shù)好用,很好用,非常好用,真的很好用,好用到龍逸凡寫了二篇文章還不過癮,還要寫第三篇
。今天這篇我們來擴(kuò)展一下,來看看它的另類用法。
第二參數(shù)為數(shù)組時(shí)會(huì)怎樣?
將REGEXP函數(shù)的第二參數(shù)用常量數(shù)組看看會(huì)怎樣:
=REGEXP(A1,{"[^一-龜]+","[一-龜]+"})
如果不理解什么是常量數(shù)組,請(qǐng)看這篇文章掃盲:
在第一篇文章中介紹過,
用=REGEXP(A1,"[^一-龜]+"})提取英文,
用=REGEXP(A1,{"[一-龜]+"})提取漢字。
詳見下面鏈接的第4部分:
但當(dāng)?shù)诙?shù)使用常量數(shù)組時(shí),它只給出了每種情況的第一個(gè)值。
所以,可利用這個(gè)特點(diǎn),來限定只提取第一個(gè)值:
=REGEXP(A1,{"[一-龜]+"})
我們繼續(xù)深入。
如果第二參數(shù)是單元格區(qū)域會(huì)怎么樣呢?
包含式反向查找(根據(jù)全稱查簡稱)
工作中有時(shí)候需要根據(jù)長的文本來查短的。比如下圖中憑證摘要中含有各品牌的車型?,F(xiàn)在需要將車型提取出來。
以前我們是LOOKUP來提取,公式:
=IFNA(LOOKUP(9^9,FIND($C$3:$C$12,$F3),C$3:C$12),"")
這公式比較復(fù)雜,我們用REGEXP函數(shù)來提取試試,第二參數(shù)填入多個(gè)車型列表:
=REGEXP(F3,$C$3:$C$12,0)
可以看到,只有一個(gè)正確的結(jié)果,其他為#N/A
我們用TOCOL來過濾掉錯(cuò)誤值,只留下正確的值:
=TOCOL(REGEXP(F3,$C$3:$C$12,0),2)
繼續(xù)擴(kuò)展,將摘要中購買的多個(gè)蔬菜和肉類名稱提取出來合并:
=TEXTJOIN("、",1,TOCOL(REGEXP(B2,$F$2:$F$10),2))
根據(jù)不連續(xù)簡稱查全稱
我們平時(shí)使用的很多簡稱,都是不連續(xù)的,比如“重慶大學(xué)”簡稱為“重大”,無法利用VLOOKUP的通配模式來查找。
這種情況的查找,其經(jīng)典公式是這樣的:
=INDEX($A$2:$A$9,MATCH(0,MMULT(-ISERR(FIND(MID(D2,COLUMN(A:Z),1),$A$2:$A$9)),$B$1:$B$26+1),))
公式很長、很復(fù)雜,如果用REGEXP函數(shù)就要簡化一點(diǎn),
公式:
=TOCOL(MAP($A$2:$A$9,LAMBDA(x,REGEXP(x,".*"®EXP(D2,"(.)",2,"\1.*")))),2)
解釋:
要理解這公式首先要理解用REGEXP提取每一個(gè)字符(拆分):
然后再用REGEXP的替換模式來插入。
具體用法見最里面的REGEXP函數(shù):
=REGEXP(D2,"(.)",2,"\1.*")
它是在每一個(gè)字之間插入“.*”,詳細(xì)解釋:
正則表達(dá)式:"(.)"
這是一個(gè)捕獲組,它匹配任何單個(gè)字符(.
表示任何字符,但只匹配一次)。捕獲組 (...)
用于記住匹配的字符,以便稍后在替換字符串中使用。
第三參數(shù)為2,為替換模式
替換模式:"\1.*"
\1
:這是一個(gè)反向引用,它引用了第一個(gè)捕獲組(在這種情況下,就是前面提到的單個(gè)字符)中匹配的文本。
"\1.*" 在第一個(gè)捕獲組后面插入“.*”
再在這個(gè)REGEXP函數(shù)的計(jì)算結(jié)果的前面,添加一個(gè)".*",將拼接結(jié)果做為最外圍的REGEXP函數(shù)的第二參數(shù)的正則表達(dá)式。
由于REGEXP函數(shù)的第一參數(shù)不支持?jǐn)?shù)組。所以得用MAP+LAMBDA函數(shù),將A2:A9單元格區(qū)域的單元格,逐個(gè)傳遞給REGEXP的第一參數(shù)。
然后用TOCOL過濾掉計(jì)算結(jié)果中的錯(cuò)誤值。
給銀行卡每四位添加一空格
從后往前每4位添加一空格的公式:
=REGEXP(A45,"(?=(?:\d{4})+$)",2," ")
正則表達(dá)式解釋:
(?=...)
:這是一個(gè)正向先行斷言的語法。它告訴正則表達(dá)式引擎,我們需要匹配一個(gè)位置,該位置后面緊跟著括號(hào)內(nèi)的模式,但光標(biāo)(即匹配位置)不會(huì)移動(dòng)到括號(hào)內(nèi)的模式之后。
(?:...)
:這是一個(gè)非捕獲組。它用于對(duì)表達(dá)式進(jìn)行分組,但不捕獲匹配的文本,即匹配結(jié)果中不會(huì)包含這部分匹配的文本。
\d{4}
:匹配四位數(shù)字。\d
表示數(shù)字字符,{4}
表示恰好四次。
+
:表示匹配前面的元素(在這個(gè)情況下是四位數(shù)字)一次或多次。
$
:表示字符串的結(jié)尾。
從前往后每4位添加一空格的公式
=REGEXP(A45,"(\d{4})(?=\d)",2,"\1 ")
正則表達(dá)式解釋:
(\d{4})
:這是一個(gè)捕獲組。
\d
表示任意一個(gè)數(shù)字字符,等同于 [0-9]
。
{4}
表示前面的元素(在這里是數(shù)字字符 \d
)重復(fù)四次。因此,\d{4}
匹配任意一個(gè)四位數(shù)。
(?=\d)
:這是一個(gè)正向先行斷言。
?=
是正向先行斷言的語法,它指定了一種條件,即在不消耗任何字符的情況下,檢查其后面的字符是否符合指定的模式。
\d
再次表示任意一個(gè)數(shù)字字符。
給字符串中的數(shù)字添加千位分隔符
如果是數(shù)值,我們可以用TEXT函數(shù)來格式化,添加千位分隔符
公式:
=TEXT(B6,"#,##0.00元")
如果是文本中的數(shù)字,就不能使用TEXT函數(shù)了,可以用REGEXP函數(shù)來添加千位分隔符,公式:
=REGEXP(B2,"(?<=\d)(?=(?:\d{3})+($|[^\d年]))",2,",")
正則表達(dá)式解釋:
(?<=\d)
:這是一個(gè)后向斷言,它用于匹配一個(gè)位置,該位置前面有一個(gè)數(shù)字(\d
),但這個(gè)數(shù)字不會(huì)被包括在匹配結(jié)果中。
(?=...)
:這是一個(gè)正向斷言,用于匹配一個(gè)位置,該位置后面跟隨有括號(hào)內(nèi)的模式,但這個(gè)模式不會(huì)被包括在匹配結(jié)果中。
(?:\d{3})+
:這是一個(gè)非捕獲組,用于匹配一個(gè)或多個(gè)連續(xù)的三位數(shù)。(?:...)
表示這是一個(gè)非捕獲組,而 \d{3}
表示恰好三個(gè)數(shù)字字符。
($|[^\d年])
:這是一個(gè)選擇結(jié)構(gòu),用于匹配字符串的結(jié)尾($
)或者一個(gè)非數(shù)字且非漢字“年”的字符([^\d年]
)。
$
表示字符串的結(jié)尾。
[^\d年]
是一個(gè)字符集,匹配任何不是數(shù)字(\d
)和漢字“年”(年
)的字符。
統(tǒng)計(jì)個(gè)數(shù)
公式:
=SUM(--REGEXP(C3,$A$3:$A$19,1))
公式解釋:
REGEXP函數(shù)的第3參數(shù)為1時(shí),是判斷模式,符合條件的為true、不符合的為false。然后在REGEXP函數(shù)前添加兩個(gè)負(fù)號(hào),負(fù)負(fù)得正,將邏輯值轉(zhuǎn)化為1和為,然后用SUM求和。
看了上面的內(nèi)容,是不是覺得REGEXP函數(shù)很神奇。
聯(lián)系客服