【问题标题】:Regex and the characters case正则表达式和字符大小写
【发布时间】:2010-08-12 07:45:27
【问题描述】:

好的,我得到了一个相当简单的(至少看起来很简单)。我有一个多行字符串,我只是在用其他东西替换不同的单词。让我告诉你...

#!/usr/bin/perl -w
use strict;

$_ = "That is my coat.\nCoats are very expensive.";
s/coat/Hat/igm;
print;

输出将是
That is my Hat
Hats are very expensive...

第一行的“帽子”不应该大写。是否有任何技巧可以使外壳符合英语的书写方式?谢谢:)

【问题讨论】:

  • 我猜你不是在油漆和涂料行业工作? :)
  • 首先,如果要区分大小写,请不要使用修饰符 i。
  • 您需要定义您的范围。您打算在 许多 个单词上使用它吗?
  • @Nikhil 我忘记省略了。好点...

标签: regex perl casing


【解决方案1】:
【解决方案2】:

您可以使用 e 修饰符到 s/// 来达到目的:

s/(coat)/ucfirst($1) eq $1 ? 'Hat' : 'hat'/igme;

【讨论】:

  • 不是一个完整的解决方案,但它涵盖了“外套”和“帽子”
【解决方案3】:

首先,您应该使用\b(单词边界)来匹配整个单词。例如,s/hat/coat/ 将把 That 更改为 Tcoat,而没有前导 \b。现在回答你的问题。使用标志/e,您可以在正则表达式的替换部分中使用 Perl 代码。因此,您可以编写一个 Perl 函数来检查匹配的大小写,然后正确设置替换的大小写:

my $s = "That is my coat.\nCoats are very expensive.";
$s =~ s/(\bcoat)/&same_case($1, "hat")/igme;
print $s, "\n";

sub same_case {
        my ($match, $replacement) = @_;

        # if match starts with uppercase character, apply ucfirst to replacement
        if($match =~ /^[A-Z]/) {
                return ucfirst($replacement);
        }
        else {
                return $replacement;
        }
}

打印:

That is my hat.
Hats are very expensive.

【讨论】:

    【解决方案4】:

    这可能会解决您的问题:

    
    #!/usr/bin/perl -w
    
    use strict;
    
    sub smartSubstitute {
        my $target = shift;
        my $pattern = shift;
        my $replacement = shift;
    
        $pattern = ucfirst $pattern;
        $replacement = ucfirst $replacement;
    
        $target =~ s/$pattern/$replacement/gm;
    
        $pattern = lcfirst $pattern;
        $replacement = lcfirst $replacement;
    
        $target =~ s/$pattern/$replacement/gm;
    
        return $target;
    }
    
    my $x = "That is my coat.\nCoats are very expansive.";
    my $y = smartSubstitute($x, "coat", "Hat");
    print $y, "\n";
    

    【讨论】:

      猜你喜欢
      • 2014-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-29
      相关资源
      最近更新 更多