2016-04-22 110 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