【问题标题】:Regular Expression for Acronyms首字母缩略词的正则表达式
【发布时间】:2011-01-04 12:04:43
【问题描述】:

我目前正在尝试从一堆文档中提取缩写词。

假设文档包含“静态应用程序安全测试 (SAST)”

所以我正在尝试创建一个正则表达式来过滤掉这些字符串。 应该是这样的

“一些单词,其首字母后来在大括号中重复。”

不幸的是,我的正则表达式不是很好地表达这一点。你们认为这完全可以通过正则表达式来完成,还是我需要更强大的东西,比如基于 CFG 的解析器?

【问题讨论】:

  • 什么语言?这可能是 .Net 中一个有趣的小正则表达式,但我不确定 Java 是否可以处理它。一般的答案是不可能使用正则表达式,但是非常容易通过循环单词手动完成,你真的不需要解析器。
  • 即使 regex 可以做到这一点,我也不确定它是否 属于 进入 best-done-via-regex 域。见To use or not to use regular expressions?。在括号中查找多个单词后跟一个全大写的无空格字母序列很容易,但最好通过正则表达式完成。
  • 哎呀,我第一次读到这篇文章时,我的大脑错误地将 anagram 注册为 acronym!我不知道正则表达式对于 acronyms 来说是那么不合适——所提供的解决方案似乎很简单——但是使用一个来生成 anagrams 就等于在一个本质上是单线程乐器,如小提琴。您必须要么疯了,要么是真正的大师,才能尝试它( BWV 1001–1006)。
  • 如果有人感兴趣,我已经用.Net groups for every length 解决了这个问题。只是一个练习。

标签: regex


【解决方案1】:

试试这个(对于 2 个字母的首字母缩写词):

\b(\w)\w+\s+\b(\w)\w+\s+\(\1\2\)

这为 3 个字母的首字母缩略词:

\b(\w)\w+\s+\b(\w)\w+\s+\b(\w)\w+\s+\(\1\2\3\)

这为 4 个字母的首字母缩略词:

\b(\w)\w+\s+\b(\w)\w+\s+\b(\w)\w+\s+\b(\w)\w+\s+\(\1\2\3\4\)

请注意,正则表达式需要不区分大小写。

顺便说一句,Regex Coach 是尝试此类东西的好工具。

【讨论】:

  • 我去看看。我这里有来自 regular-expressions.info 的工具。只是还没有在整个问题上花费太多脑细胞。
【解决方案2】:

这里有两个 Perl 解决方案:第一个逐字逐句地构造一个由每个单词的第一个字母组成的数组,然后删除由这些字母组成的首字母缩写词。它相当弱,如果每行不仅仅是首字母缩写词和字母,它应该会失败 - 它还利用 (??{}) 模式将首字母缩写词插入正则表达式,这让我感到不安:

use strict;
use warnings;
use 5.010;

$_ = "Static application security testing (SAST)";

my @first;
s/
   \b
    (?<first>\p{L})\p{L}*
   \b
(?{ push @first, $+{first} })
  \K \s+ \(
    (??{ join '', map { uc } @first; })
    \)
//gx;

say;

同时,此解决方案首先检查首字母缩略词之类的内容,然后构造一个正则表达式以匹配所需的尽可能多的单词: $_ = "静态应用安全测试 (SAST)";

my ($possible_acronym) = /\((\p{Lu}+)\)/;
my $regex = join '', map({ qr/\b(?i:$_)\p{L}*\b\s*?/ } split //, $possible_acronym), qr/\K\Q($possible_acronym)/;
s/$regex//;

say;

(我尝试使用 (?(DEFINE)) 模式制作解决方案,例如 tchrist 的回答 here,但惨遭失败。哦,好吧。)

有关 (?:)、命名捕获 (?)、\K 和一大堆膨胀的东西的更多信息,perlre 就是答案。

【讨论】:

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