正则表达式匹配首字母缩略词及其定义

时间:2014-04-16 16:28:54

标签: regex pcre

我需要一个正则表达式来查找首字母缩略词及其定义。 我尝试匹配大写英文字母序列,然后是以这些字母开头的单词。例如:

欧盟欧盟

我需要匹配以下"语法":

<Capital letters> <Tabs or spaces>
<Optional "(">
<Optional tabs or spaces> <Matching definition words> <Optional tabs or spaces>
<Optional ")">

以下命令查找当前目录中所有文件中的所有首字母缩写词(不短于2个字母):

grep -aRoP '([A-Z])([A-Z])([A-Z])?([A-Z])?([A-Z])?([A-Z])?[ \t]+\(?[ \t]*\1[a-z]* \2[a-z]*(?(3) \3[a-z]*)(?(4) \4[a-z]*)(?(5) \5[a-z]*)(?(6) \6[a-z]*)[ \t]*\)?' .

但它限制了首字母缩略词的长度(最多6个字符)。 是否有可能以更紧凑的方式重写正则表达式,消除对首字母缩略词长度的限制?可能这可以用递归模式完成。

1 个答案:

答案 0 :(得分:0)

$regex = '/(([A-Z])((?2)+))\s+\(?(((?:\s+)?(?3)\w+)(?:\s+)?(?4)?)\)?/';
$acronyms = array('EU European  Union', 'HTTP Hyper Text Transfer Protocol', 'NOT AN ACRONYM');

foreach ($acronyms as $subject) {
    $result = preg_match($regex, $subject, $matches);
    if ($result && $matches[0] === $subject) {
      echo "pass\n";
    } else {
      echo "fail\n";
    }
}

这应该做你想要的。