2016-04-22 37 views
2

我需要在一些文本中大寫首字母縮寫詞。正則表達式匹配重疊/交叉

目前,我有這個正則表達式匹配的首字母縮寫:

/(^|[^a-z0-9])(ECU|HVAC|ABS|ESC|EGR|ADAS|HEV|HMI)($|[^a-z0-9])/ig 

說明:此的目標是一致的任何地方,他們要麼是在文本的開始或結束,或有ISN」的首字母縮寫詞在他們的任何一邊寫一個字母或數字(因爲那麼他們可能是一個詞的一部分 - 例如我不想替換單詞「Escape」中的「Esc」)。

這工作的大部分時間,但下面的例子不工作:

"abs/esc" 

它匹配的abs,但不是esc。我猜這是因爲比賽重疊,因爲正斜槓是與abs有關的比賽的一部分。

任何人都可以建議如何獲得一個匹配?

作爲一個方面說明,我使用PHP的preg_replace_callback事後進行轉換:

$name = 'abs/esc'; 
$name = preg_replace_callback('/(^|[^a-z0-9])('ECU|HVAC|ABS|ESC|EGR|ADAS|HEV|HMI')($|[^a-z0-9])/i', function($matches) { 
    return $matches[1] . strtoupper($matches[2]) . $matches[3]; 
}, $name); 

回答

3

是的原因是因爲它與重疊(匹配abs時,也消耗了/然後爲esc。 ,它找不到[^a-z0-9],因爲它正在掃描的下一個字母是e)。

你可以使用這個表達式來代替:

\b(ECU|HVAC|ABS|ESC|EGR|ADAS|HEV|HMI)\b 

\b是一個Word Boundary,它不消耗任何字符,因此不會有重疊

Live Demo on Regex101


您也可以更改RegEx以使用正預測先行,因爲這也是不消耗字符:

(^|[^a-z0-9])(ECU|HVAC|ABS|ESC|EGR|ADAS|HEV|HMI)(?=$|[^a-z0-9]) 

Live Demo on Regex101

+0

精氨酸 - 忘字的邊界 - 新秀錯誤 - 謝謝。 –

+0

是的 - 只是等待它讓我 - 似乎是一個延遲 –

+0

沒問題!而且,是的,有一個延遲(我覺得它也很煩人)。謝謝! :) – Druzion