给定文字
my $line = "[cytokine]<ADJVNT-PROP-0> signaling, which have not [to]<PREP> date been shown [to]<PREP> be [[regulat]<EXP-V-0>ed]<EXP-PP-V-0>";
my $line2 = "[Human [papillomavirus]<VACC-PROP-0>]<VACC-PROP-0> genotype [31]<NUM> does not [express]<EXP-V-0> detectable [microRNA]<MIR-0> levels [during]<PREP> latent or productive virus replication.";
我想要删除的所有内容都不是<XXX>
结果如下:
Output 1: <ADJVNT-PROP-0><PREP><PREP><EXP-V-0><EXP-PP-V-0>
Output 2: <VACC-PROP-0><VACC-PROP-0><NUM><EXP-V-0><MIR-0><PREP>
但为什么这个正则表达式失败了?什么是正确的方法?
s/[^<.*>]//g
这是完整的代码和可执行文件:https://eval.in/50996
答案 0 :(得分:2)
您的替换s/[^<.*>]//g
使用字符类,它匹配任何单个字符,它不是开括号或近角括号,点或星号。所以它会删除所有这些字符,只留下那四个中的一个。
尝试编写单一正则表达式有一种奇怪的热情,可以解决整个问题。这里更容易找到尖括号中包含的所有字符串并将它们连接在一起,就像这样。
use strict;
use warnings;
use feature 'say';
my $line = "[cytokine]<ADJVNT-PROP-0> signaling, which have not [to]<PREP> date been shown [to]<PREP> be [[regulat]<EXP-V-0>ed]<EXP-PP-V-0>";
my $line2 = "[Human [papillomavirus]<VACC-PROP-0>]<VACC-PROP-0> genotype [31]<NUM> does not [express]<EXP-V-0> detectable [microRNA]<MIR-0> levels [during]<PREP> latent or productive virus replication.";
say join '', $line =~ /<[^<>]*>/g;
say join '', $line2 =~ /<[^<>]*>/g;
<强>输出强>
<ADJVNT-PROP-0><PREP><PREP><EXP-V-0><EXP-PP-V-0>
<VACC-PROP-0><VACC-PROP-0><NUM><EXP-V-0><MIR-0><PREP>
答案 1 :(得分:1)
答案 2 :(得分:0)
你可以试试这个。
s/[^<]*(<[^>]+>)[^<]*/$1/g;