gpt4 book ai didi

regex - 如何在 Perl 中重构正则表达式

转载 作者:行者123 更新时间:2023-12-01 11:42:51 26 4
gpt4 key购买 nike

我有以下句子:

     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.

我想做的是创建一个可以匹配的单一正则表达式(regex)以上两句。请注意,上述句子中唯一不同的模式是中间因素<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";
}
}

Live demo

最佳答案

(?: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

第二个魔法:

(a|b|c) - choose metasymbol in work. I would choose between <a> or <b> or <c>

第三个魔法:

Here Rubular work

概括:

.+?\s*<MIR-\d+>\s*.+?\s*(?:<EXP-V-\d+>|<ASSC-PHRASE-\d+>)\s*.+?\s*<VACCVIRUS-PROP-\d+>.+

你的例子:

Here Rubular work too

拒绝字符串:

.+?\s*<MIR-\d+>\s*[^\[]+?\s*(?:<EXP-V-\d+>|<ASSC-PHRASE-\d+>)\s*[^\]]+?\s*<VACCVIRUS-PROP-\d+>.+

第四个魔法:

[^SYMBOLS] - Class of symbols. <^> At the beginning mean 'I DON'T want match them'.

这里例子:

[abc]{1} - I will match <a> or <b> or <c>
[^abc]{1} - I will NOT match <a> or <b> or <c>

Here Rubular work again

关于regex - 如何在 Perl 中重构正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17803882/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com