【问题标题】:How to translate a string, word by word, on FIFO basis in Perl given a string not an array?在给定字符串而不是数组的情况下,如何在 Perl 中基于 FIFO 逐字翻译字符串?
【发布时间】:2015-06-23 10:12:38
【问题描述】:

我有一个在 Perl 中给出的字符串(这意味着我不能在开头将每个标记存储在数组中):

$string = "applegrapeorangelimepineapple";

如果字符串匹配单词列表并打印相关值,我如何匹配并“移动”字符串中的第一个单词?

我的意思是如果apple匹配了“red”这个词,我需要先打印“red”这个词,然后从字符串$string中去掉子串“apple”,那么$string就会变成:

$string = "grapeorangelimepineapple";

并继续再次检查第一个单词,如果它与单词“grape”主列表中的单词匹配,程序将打印“purple”,等等?

总的来说,给定一个字符串:

$string = "applegrapeorangelimepineapple";

如何翻译成:

"red purple orange lime yellow";

并删除在主列表中找不到的不相关单词或字符?

感谢您的帮助。

【问题讨论】:

    标签: regex string perl translate


    【解决方案1】:

    您可以按照您想要匹配的顺序创建一个您希望匹配的模式数组,然后针对字符串的开头重复进行模式匹配。请注意,以下仅尝试将一种模式与字符串的前面进行匹配,而不是全部匹配,从您的问题中不清楚您想要哪种行为。无论如何,您应该能够轻松地从这个解决方案中调整该解决方案。

    #!/usr/bin/env perl 
    
    use strict; 
    use warnings;
    
    use feature qw(say);
    
    my $string = "applegrapeorangelimepineapple";
    my @patterns = qw(apple grape orange lime pineapple);
    my %pattern_map; 
    @pattern_map{@patterns} = qw(red purple orange yellow yellow);
    
    foreach my $pattern ( @patterns ) {
       my ($match) = $string =~ s/^\Q$pattern\E//;
       next unless $match;
    
       say $pattern_map{$pattern};
    }
    
    __END__
    red
    purple
    orange
    yellow
    yellow
    

    【讨论】:

    • 感谢亨特麦克米伦。您还知道如何转义特殊符号 '^' 吗?我也在我的字符串中遇到了这个。
    • @pythonhiew 如果将要匹配的文字模式包装在\Q\E 中,则不会应用正则表达式元字符,它们只会被视为文字字符。您可以查看我的编辑作为示例。
    • 我可以使用 $string =~ s/$string/\Q$variableFromMasterList\E/gi 吗?这样它就会为我完成整个字符串的工作,但我认为它现在不起作用。抱歉,我之前没有在我的问题中包含,因为我刚刚尝试过。
    • 如果你愿意,你可以这样做,但是/g 标志匹配整个字符串,因此可以返回多个匹配项。你需要捕捉所有这些匹配,试试my @matches = $string =~ s/\Q$variableFromMasterList\E//gi;
    • 似乎无法正常工作。也许是因为单词粘在一起而不是空格分隔。我不知道它周围的方式。
    猜你喜欢
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多