我目前正试图从一堆文件中删除acronmys。
假设文档包含“静态应用程序安全性测试(SAST)”
所以我试图创建一个用于过滤掉这些字符串的正则表达式。 它可能应该像
“许多单词的首字母后来在括号中重复出现。”
不幸的是,我的正则表达式并不是很好。你是否认为可以通过正则表达式完成,或者我是否需要像基于CFG的解析器那样更强大的东西?
答案 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就是答案。