我一直在努力做到以下几点:
if (m/(foobar)\{2,}?/ig)
处理文件并仅对那些存在大于2个'foobar'的行进行操作。不工作 - 我怀疑它可能需要“反向引用”技术,但如果有人能用简单的匹配技术做到这一点,我会感到惊喜
答案 0 :(得分:7)
您无法使用{}
量词,因为这仅适用于重复。 (例如“foobar foobar foobar”)。如果你的字符串有“fooobar更多foobar”,它将无法匹配。最简单,最清晰的方法是将匹配推送到这样的数组:
my @matches = $str =~ /(foobar)/ig;
然后@matches
将举行所有比赛。
if (@matches >=2) {
# work in special sauce
}
答案 1 :(得分:7)
这很简单:
if ( $str =~ /foobar.*foobar/ ) {
当然 - 你的foobar可能有点复杂,所以让我们使用反向引用:
if ( $str =~ /(foobar).*\1/ ) {
如果你想让它匹配,只要这个符合5次就足够了怎么办?简单:
if ( $str =~ /(foobar)(.*\1){4}/ ) {
或更好:
if ( $str =~ /(foobar)(?:.*\1){4}/ ) {
有关?:和其他此类魔法字符串的详细信息,您可以选择perldoc perlre。