缩略语的正则表达式

时间:2011-01-04 12:04:43

标签: regex

我目前正试图从一堆文件中删除acronmys。

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

所以我试图创建一个用于过滤掉这些字符串的正则表达式。 它可能应该像

“许多单词的首字母后来在括号中重复出现。”

不幸的是,我的正则表达式并不是很好。你是否认为可以通过正则表达式完成,或者我是否需要像基于CFG的解析器那样更强大的东西?

2 个答案:

答案 0 :(得分:3)

试试这个(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\)

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

BTW Regex Coach是一个很好的工具,可以尝试这样的东西。

答案 1 :(得分:1)

这里有两个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就是答案。