Regex 正则表达式以任意顺序删除特定单词

Regex 正则表达式以任意顺序删除特定单词,regex,perl,words,optional,substitution,Regex,Perl,Words,Optional,Substitution,我想替换(删除)特定的可选单词(AAA、BBB、CCC),它们在特定单词之前和之后的顺序是任意的(总是在那里) 到 如何在perl(或任何其他UNIX可用程序)中实现这一点?在perl中尝试此正则表达式(假设单词之间只有一个空格): 如果您不需要在“始终在那里”部分之后切掉某些与AAA、BBB或CCC不匹配的内容,请使用以下内容: s/(.*)(?:(?:(?:AAA|BBB|CCC) )*ALWAYS_THERE(?: (?:AAA|BBB|CCC))*)(.*)/$1$2/ 在perl中尝

我想替换(删除)特定的可选单词(AAA、BBB、CCC),它们在特定单词之前和之后的顺序是任意的(总是在那里)

如何在perl(或任何其他UNIX可用程序)中实现这一点?

在perl中尝试此正则表达式(假设单词之间只有一个空格):

如果您不需要在“始终在那里”部分之后切掉某些与AAA、BBB或CCC不匹配的内容,请使用以下内容:

s/(.*)(?:(?:(?:AAA|BBB|CCC) )*ALWAYS_THERE(?: (?:AAA|BBB|CCC))*)(.*)/$1$2/
在perl中尝试这个正则表达式(假设单词之间只有一个空格):

如果您不需要在“始终在那里”部分之后切掉某些与AAA、BBB或CCC不匹配的内容,请使用以下内容:

s/(.*)(?:(?:(?:AAA|BBB|CCC) )*ALWAYS_THERE(?: (?:AAA|BBB|CCC))*)(.*)/$1$2/
试试这个:

s/\b(AAA\s+|BBB\s+|CCC\s+)*ALWAYS_THERE(\s+AAA|\s+BBB|\s+CCC)*\b//g;
[根据@ikegami编辑以添加前导和尾随
\b

尝试以下操作:

s/\b(AAA\s+|BBB\s+|CCC\s+)*ALWAYS_THERE(\s+AAA|\s+BBB|\s+CCC)*\b//g;

[编辑以添加前导和尾随
\b
per@ikegami]

这与其他答案相当,但也有一些优点——特别是,添加更多的忽略标记不太容易出错(因为您只需将它们添加到数组中;正则表达式是从数组中构建的,
$always\u那里
自动:

my $always_there = 'ALWAYS_THERE';
my @ignore = (
    'AAA',
    'BBB',
    'CCC',
);

my $ig_str = '('.join('|', map { "$_\\b\\s*" } @ignore).')*';

$data =~ s/$ig_str$always_there\s+$ig_str//; #Add /g modifier if ALWAYS_THERE can appear > once

这与其他答案是一样的,但也有一些优点——特别是,添加更多的忽略标记不太容易出错(因为您只需将它们添加到数组中;正则表达式是从数组中构建的,
$always\u那里
自动:

my $always_there = 'ALWAYS_THERE';
my @ignore = (
    'AAA',
    'BBB',
    'CCC',
);

my $ig_str = '('.join('|', map { "$_\\b\\s*" } @ignore).')*';

$data =~ s/$ig_str$always_there\s+$ig_str//; #Add /g modifier if ALWAYS_THERE can appear > once
尝试此模式(\s*(AAA | BBB | CCC))*\s*始终在那里。*$

尝试这种模式
(\s*(AAA | BBB | CCC))*\s*始终在那里。*$

您可以使用此模式:

s/((?:\s+(?:AAA|BBB|CCC))*)\s+ALWAYS_THERE\g<1>//g

您可以使用以下模式:

s/((?:\s+(?:AAA|BBB|CCC))*)\s+ALWAYS_THERE\g<1>//g


这真的不公平。这是一个新手问题,但显然是关于“如何编写一个正则表达式来匹配我所描述的模式?”,这并不完全是微不足道的。阅读perlintro很重要,但它不太可能帮助提问者解决这个具体问题。@qwrrty-我怀疑“公平”是通过引用这些资源来实现的:1)鼓励OP展示解决方案尝试,2)培养钓鱼技能,而不仅仅是给OP一条鱼。任何一个提供的解决方案都有多大意义?W/O A(最小)ReEX基金会?我都赞成通过教他们钓鱼来养活人,但这更像是通过教他们把两个棍子揉在一起来喂养他们。链接到A至少比perlintro@qwrrty更适合这个问题-我不同意。perlintro正则表达式部分的第一句话说:“Perl的正则表达式支持既广泛又深入,在国内外都是冗长文档的主题。”在第一句中引用的两个资源都是建立ReGeX基金会的好的合适的地方。写一个有效的正则表达式的问题太多了。这不太公平。这是一个新手问题,但它显然是关于“如何编写一个正则表达式来匹配我所描述的模式”,这并不是一个简单的问题。阅读
perlintro
很重要,但它不太可能帮助提问者解决这个具体问题。@qwrrty-我怀疑“公平”是通过引用这些资源来实现的:1)鼓励OP展示解决方案尝试,2)发展钓鱼技能,而不仅仅是给OP一条鱼。任何一个提供的解决方案都有多大意义?W/O A(最小)ReEX基金会?我都赞成通过教他们钓鱼来养活人,但这更像是通过教他们把两个棍子揉在一起来喂养他们。链接到A至少比perlintro@qwrrty更适合这个问题-我不同意。perlintro正则表达式部分的第一句话说:“Perl的正则表达式支持既广泛又深入,在国内外都是冗长文档的主题。”在第一句中引用的两个资源都是建立ReGeX基金会的好的和合适的地方。写一个有效的正则表达式的问题太多了,你可能需要考虑在这个模式的结尾加上一个S+量词,或者“AAA总是在BBB其他的地方”被转换成“其他东西”。这在某种程度上是一个品味问题,但如果可能的话,我更喜欢构建正则表达式(见我的答案),而不是硬编码它们。我不确定将“某物AAA总是在那里BBB其他”转换为“某物其他”是否是错误的。当我读到OP的请求时,这将是一个正确的答案。这取决于他们。应该放一个前导和尾随的
\b
或什么的。它不仅可以防止
xAAA
中的
xAAA总是在那里被删除,还可以减少回溯。还有一个问题,导致两个相邻的空间。留下一个尾随空间(例如“这很重要”),你应该考虑在这个模式的结尾加上一个s+量词,或者“AAA总是在BBB其他的东西”被转换成“其他东西”。这在某种程度上是一个品味问题,但如果可能的话,我更喜欢构建正则表达式(见我的答案),而不是硬编码它们。我不确定将“某物AAA总是在那里BBB其他”转换为“某物其他”是否是错误的。当我读到OP的请求时,这将是一个正确的答案。这取决于他们。应该放一个前导和尾随的
\b
或什么的。它不仅可以防止
xAAA
中的
xAAA总是在那里被删除,还可以减少回溯。还有导致两个相邻空格的问题。留下一个尾随空格(例如“这很重要”),但您的演示显示替换失败于
这很重要BBB这也总是有CCC AAA
。但您的演示显示替换失败于
这很重要BBB这也总是有CCC AAA