【问题标题】:I want to search for case insensitive string and replace with original string in perl我想搜索不区分大小写的字符串并用 perl 中的原始字符串替换
【发布时间】:2015-11-18 05:36:58
【问题描述】:

我正在尝试在字符串中搜索子字符串并突出显示搜索文本。我到目前为止是这样的:

$text = 'Guitar';
$search = 'guit';

使用下面的代码,我返回字符串“guitar”,突出显示“guit”,但我想返回原始的“Guit”,突出显示大写的“G”。任何帮助将不胜感激。

my $replace = "<span style='color:white;background- color:red'>$search</span>";
$text =~ s/$search/$replace/gi;

【问题讨论】:

  • 为什么不使用$search = 'Guit'?这样不敏感的搜索就会捕获它,并且替换仍然会给你大写的 G
  • 是的,但我也希望能够搜索“guit”。
  • 如果您搜索不区分大小写 - 两者都可以
  • 我的问题是将突出显示的文本替换为原始字符串

标签: string perl


【解决方案1】:

这成功了。

my ($original) = $text =~ m/$search/gi;
my $replace = "<span style='color:white;background-color:red'>$original</span>";
$text =~ s/$search/$replace/gi;

【讨论】:

    【解决方案2】:

    您要求将替换字符串保存在标量变量中,从而使这变得困难。没有那个

    $text =~ s{($search)}{<span style='color:white;background-color:red'>$1</span>}gi;
    

    可以正常使用

    你需要/ee eval 表达式修饰符,就像这样

    use strict;
    use warnings;
    use 5.010;
    
    my $text   = 'Guitar';
    my $search = 'guit';
    
    my $replace = q{<span style='color:white;background-color:red'>$1</span>};
    
    $text =~ s/($search)/ "qq{$replace}" /eegi;
    
    say $text
    

    输出

    <span style='color:white;background-color:red'>Guit</span>ar
    

    【讨论】:

      【解决方案3】:

      使用$&amp;, which will be set to the matched string:

      my $text = "Albert Hammond's guitar from Gibraltar.";
      
      foreach my $text ('guitar', 'Gibraltar') {
          my $replace = "<span style='color:white;background-color:red'>" . $& . "</span>";
          $text =~ s/$search/$replace/gi;
      }
      

      更新:这不起作用,因为下面的@ThisSuitIsBlackNot cmets:当替换字符串是变量时,$&amp; 将不会在替换字符串中被解释。 (我不知道。)所以你必须摆脱这个变量:

      my $text = "Albert Hammond's guitar from Gibraltar.";
      
      foreach my $search ('guitar', 'Gibraltar') {
          my $replace = "";
          $text =~ s/$search/<span style='color:white;background-color:red>$&<\/span>/gi;
      }
      

      打印出来

      Albert Hammond's <span style='color:white;background-color:red>guitar</span> from <span style='color:white;background-color:red>Gibraltar</span>.
      

      请注意,我还必须转义替换字符串中的/,因为/ 也用于分隔s 命令的参数。

      这可能还不够好。

      它假定$search 的值永远不会包含任何正则表达式特有的字符(例如.*)。 如果可能,您可以使用 qr 转义它们。

      它还假定这些值从不包含任何 XML 特殊字符(例如 &lt;&gt;,或在我的示例中为 '。)。如果可能,请使用 XML 操作库(例如 XML::LibXML)进行更改,或使用 XSLT。

      【讨论】:

      • $&amp; 仅在 匹配后设置,因此这不起作用(对于 performance reasons,您通常不应在 Perl $&无论如何;即使那样,我也会使用捕获组)。
      • 它不会起作用,因为$&amp;undef 当你连接它时,所以$replace 被设置为一个空的span 标签。您正在寻找s/foo/bar$&amp;baz/s/foo/"bar".$&amp;."baz"/es/foo/"qq{$replace}"/ee
      • 你说的完全正确——我从来不知道这一点。相应地更改了答案。
      • 只是一个小提示 - 您可以使用任何字符作为 s 的分隔符,就像在 sed 中一样,所以如果您不想担心转义斜杠,您可以使用例如@,喜欢这个$text =~ s@$search@&lt;span style='color:white;background-color:red&gt;$&amp;&lt;/span&gt;@gi;
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-05
      • 2011-12-20
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多