【问题标题】:Regex to match acronyms and its definitions正则表达式匹配首字母缩写词及其定义
【发布时间】:2014-04-16 16:28:54
【问题描述】:

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

欧盟欧盟

我需要匹配以下“语法”:

<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 个字符)。 是否可以以更紧凑的方式重写正则表达式,消除对首字母缩写词长度的限制?可能这可以通过递归模式来完成。

【问题讨论】:

  • 不能将[A-Z]{1,6} 用于 1 到 6 大写吗?还是 [A-Z]+ 表示 1 或无限大写?
  • 没有。我需要获取其定义后跟的首字母缩略词。我不需要首字母缩写词本身(没有它们的含义)。我需要一个正则表达式来查找首字母缩写词及其定义。正则表达式必须匹配“EU European Union”而不是“EU”或“EU Blah-Blah”。
  • 我不会为此使用正则表达式,只需使用循环来检查每个大写字母,然后根据每个单词检查它们(您可以轻松地将其作为匹配的 [A-Z]\w+字符串的其余部分)使用正确的工具来完成这项工作。正则表达式很棒,但并非适用于一切。
  • 我的正则表达式运行良好。但我很好奇,能否以递归或平衡组的方式进行改进。

标签: regex pcre


【解决方案1】:
$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";
    }
}

这应该可以满足您的需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多