我有以下句子:
Run Code Online (Sandbox Code Playgroud)text <MIR-1> GGG-33 <EXP-V-3> text text <VACCVIRUS-PROP-1> some other. text <MIR-1> text <ASSC-PHRASE-1> text <VACCVIRUS-PROP-1> some other <PATTERN-1> other.
我想要做的是建立一个单一的正则表达式(正则表达式),可以将两个句子匹配以上.请注意,上述句子中唯一不同的模式是中间因素<EXP-V-3>
和<ASSC-PHRASE-1>
.
我对当前的尝试感到困惑,它在两个冗余正则表达式中匹配它们.什么是正确的方法呢?
use Data::Dumper;
@sent = ("text <MIR-1> GGG-33 <EXP-V-3> text text <VACCVIRUS-PROP-1> some other.",
" text <MIR-1> text <ASSC-PHRASE-1> text <VACCVIRUS-PROP-1> some other <PATTERN-1> other.");
foreach $sent (@sent) {
if ( $sent =~ /.*<MIR-\d+>.*<EXP-V-\d+>.*<VACCVIRUS-PROP-\d+>.*/gi ) {
print "$sent\n";
}
elsif( $sent =~ /.*<MIR-\d+>.*<ASSC-PHRASE-\d+>.*<VACCVIRUS-PROP-\d+>/gi ) {
print "$sent\n";
}
}
Run Code Online (Sandbox Code Playgroud)
(?:xxx|yyy)\s*<MIR-1>\s*(?:xxx|yyy)\s*(?:<EXP-V-3>|<ASSC-PHRASE-1>)\s*(?:xxxx|yyy)\s*<VACCVIRUS-PROP-1>
也许这个正则表达式没有优化,但它的工作原理.
好的,我在这里做的:
第一魔术:
(?:EXPR) - Capture group NOT CAPTURED # <?:> helps to avoid any capturing
Run Code Online (Sandbox Code Playgroud)
第二魔术:
(a|b|c) - choose metasymbol in work. I would choose between <a> or <b> or <c>
Run Code Online (Sandbox Code Playgroud)
第三魔术:
概括:
.+?\s*<MIR-\d+>\s*.+?\s*(?:<EXP-V-\d+>|<ASSC-PHRASE-\d+>)\s*.+?\s*<VACCVIRUS-PROP-\d+>.+
Run Code Online (Sandbox Code Playgroud)
你的例子:
拒绝字符串:
.+?\s*<MIR-\d+>\s*[^\[]+?\s*(?:<EXP-V-\d+>|<ASSC-PHRASE-\d+>)\s*[^\]]+?\s*<VACCVIRUS-PROP-\d+>.+
Run Code Online (Sandbox Code Playgroud)
第四魔术:
[^SYMBOLS] - Class of symbols. <^> At the beginning mean 'I DON'T want match them'.
Run Code Online (Sandbox Code Playgroud)
这里示例:
[abc]{1} - I will match <a> or <b> or <c>
[^abc]{1} - I will NOT match <a> or <b> or <c>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
136 次 |
最近记录: |