代码之家  ›  专栏  ›  技术社区  ›  singingfish

在Perl中匹配和替换几个单词时,如何保留空白?

  •  1
  • singingfish  · 技术社区  · 15 年前

    假设我有一些原文:

    here is some text that has a substring that I'm interested in embedded in it.
    

    我需要文本来匹配其中的一部分,说:“ has a substring “。

    但是,原始文本和匹配字符串可能有空格差异。例如,匹配文本可能是:

    has a
    substring
    

    has  a substring
    

    和/或原文可能是:

    here is some
    text that has
    a substring that I'm interested in embedded in it.
    

    我需要输出的程序是:

    here is some text that [match starts here]has a substring[match ends here] that I'm interested in embedded in it.
    

    我还需要在原始文件中保留空白模式,只需在其中添加开始和结束标记。

    关于如何使用PerlRegex来实现这一点有什么想法吗?我试过了,但最后却变得非常困惑。

    5 回复  |  直到 15 年前
        1
  •  5
  •   brian d foy    15 年前

    自从我使用Perl正则表达式以来已经有一段时间了,但是关于:

    $match = s/(has\s+a\s+substring)/[$1]/ig
    

    这将捕获单词之间零个或多个空格和换行符。它将用括号包装整个匹配,同时保持原始的分离。它不是自动的,但它确实起作用。

    你可以用这个来玩游戏,比如拉绳子 "has a substring" 对它进行改造 "has\s*a\s*substring" 让它不那么痛苦。

    编辑 :合并了Yth的注释,说明元字符与换行符和Hobbs对我的用法的更正相匹配。

        2
  •  3
  •   Doug Hays    15 年前

    此模式将匹配您要查找的字符串:

    (has\s+a\s+substring)
    

    因此,当用户输入搜索字符串时,将搜索字符串中的任何空白替换为 \s+ 你有你的模式。把每一场比赛都换成 [match starts here]$1[match ends here] 哪里 $1 是匹配的文本。

        3
  •  2
  •   friedo    15 年前

    在正则表达式中,可以使用 + 意思是“一个或多个”,所以像这样

    /has\s+a\s+substring/
    

    比赛 has 后接一个或多个空格字符,后接 a 后接一个或多个空格字符,后接 substring .

    将它与替换运算符组合在一起,可以说:

    my $str = "here is some text that has     a  substring that I'm interested in embedded in it.";
    $str =~ s/(has\s+a\s+substring)/\[match starts here]$1\[match ends here]/gs;
    
    print $str;
    

    输出为:

    here is some text that [match starts here]has     a  substring[match ends here] that I'm interested in embedded in it.
    
        4
  •  0
  •   Markus Jarderot    15 年前

    很多人建议,使用 \s+ 以匹配空白。以下是您自动完成的方法:

    my $original = "here is some text that has a substring that I'm interested in embedded in it.";
    my $search = "has a\nsubstring";
    
    my $re = $search;
    $re =~ s/\s+/\\s+/g;
    
    $original =~ s/\b$re\b/[match starts here]$&[match ends here]/g;
    
    print $original;
    

    输出:

    here is some text that [match starts here]has a substring[match ends here] that I'm interested in embedded in it.

    您可能希望转义字符串中的任何元字符。如果有人感兴趣,我可以补充一下。

        5
  •  0
  •   Brad Gilbert    15 年前

    这是一个如何做到这一点的例子。

    #! /opt/perl/bin/perl
    use strict;
    use warnings;
    
    my $submatch = "has a\nsubstring";
    
    my $str = "
    here is some
    text that has
    a substring that I'm interested in, embedded in it.
    ";
    
    print substr_match($str, $submatch), "\n";
    
    sub substr_match{
      my($string,$match) = @_;
    
      $match =~ s/\s+/\\s+/g;
    
      # This isn't safe the way it is now, you will need to sanitize $match
      $string =~ /\b$match\b/;
    }
    

    这当前执行任何操作以检查 $match 不安全字符的变量。